Skip to content
On this page

列的属性

简单的查询

查询语句

shell
select * from 表名;

简单的插入

插入数据以行为单位

shell
INSERT INTO 表名(列1, 列2, ...) VALUES(列1的值,列2的值, ...);

也可只指定部分列的值,不过其他列默认值为 null

shell
INSERT INTO 表名(列1) VALUES(列1的值);

批量插入

shell
INSERT INTO 表名(列1,列2, ...) VAULES(列1的值,列2的值, ...), (列1的值,列2的值, ...), (列1的值,列2的值, ...), ...;

属性

默认值

当插入数据时没有定义默认值,则所有默认值都为 NULL;而不想默认值为 NULL 时,可以给列增加 DEFAULT 属性

shell
列名 列的类型 DEFAULT 默认值
shell
mysql> create table test_table(
    -> name varchar(5),
    -> age int default 18);
Query OK, 0 rows affected (0.72 sec)

然后插入一条数据

shell
insert into test_table(name) values('Mondo');

插入数据并没有设置 age 列的值,查看 test_table 表数据,可以看出默认值变成了 18

shell
mysql> select * from test_table;
+-------+------+
| name  | age  |
+-------+------+
| Mondo |   18 |
+-------+------+
1 row in set (0.00 sec)

mysql>

NOT NULL 属性

设置列 NOT NULL 属性可以让列不能设置 NULL

shell
mysql> create table test_table(
    -> name varchar(5) not null,
    -> age int default 18);
Query OK, 0 rows affected (0.71 sec)

这样 name 值不能被设置默认值 NULL

shell
mysql> insert into test_table(age) values(20);
ERROR 1364 (HY000): Field 'name' doesn't have a default value
mysql>

可以看到没有设置默认值,就会报错

主键

候选键:通过表中的某一列或某些列确认一条记录,那么这个列或这些列叫做候选键

比如 stundet_info 表中可以根据学号来确认某个学生的唯一记录,或者 student_score 根据 学号科目来确认唯一的成绩记录,所以学号和科目这个组合就是学生成绩表的候选键

一张表可以存在多个候选键,选择其中一个作为表的主键

  • 一张表只存在一个主键
  • 主键值不可重复,是唯一值
  • 默认 NOT NULL 属性,必填

声明方法

  • 如果是单个列设为主键,可以直接在列后定义 primary key
shell
CREATE TABLE student_info (
    number INT PRIMARY KEY,
    name VARCHAR(5),
    sex ENUM('男', ''),
    id_number CHAR(18),
    department VARCHAR(30),
    major VARCHAR(30),
    enrollment_time DATE
);
  • 也可以单独定义
shell
PRIMARY KEY (列名1, 列名2, ...)
shell
CREATE TABLE student_info (
    number INT,
    name VARCHAR(5),
    sex ENUM('男', ''),
    id_number CHAR(18),
    department VARCHAR(30),
    major VARCHAR(30),
    enrollment_time DATE,
    PRIMARY KEY (number)
);

对于多个列组合为主键的情况下,只能使用单独定义

shell
CREATE TABLE student_score (
    number INT,
    subject VARCHAR(30),
    score TINYINT,
    PRIMARY KEY (number, subject)
);

UNIQUE 属性

对于不是主键的其他候选键,也可以添加约束属性,添加方式和 primary key 类似

shell
CREATE TABLE student_info (
    number INT PRIMARY KEY,
    name VARCHAR(5),
    sex ENUM('男', ''),
    id_number CHAR(18) UNIQUE,
    department VARCHAR(30),
    major VARCHAR(30),
    enrollment_time DATE
);

多个键名必须单独声明

shell
CREATE TABLE student_info (
    number INT,
    name VARCHAR(5),
    sex ENUM('男', ''),
    id_number CHAR(18),
    department VARCHAR(30),
    major VARCHAR(30),
    enrollment_time DATE,
    PRIMARY KEY (number),
    UNIQUE KEY (id_number)
);

主键与 UNIQUE 区别

  • 一张表只能出现唯一主键,但可以出现多个 UNIQUE 约束
  • 主键列不能存储 NULL 值,UNIQUE 约束可以存放 NULL 值

外键

如果A表中的某个列或者某些列依赖与B表中的某个列或者某些列,那么就称A表为子表,B表为父表。子表和父表可以使用外键来关联起来。上边例子中 student_score 表的 number 列依赖于 student_infonumber 列,所以 student_info 就是一个父表,student_score 就是子表。我们可以在 student_score 的建表语句中来定义一个外键

shell
CREATE TABLE student_score (
    number INT,
    subject VARCHAR(30),
    score TINYINT,
    PRIMARY KEY (number, subject),
    CONSTRAINT FOREIGN KEY(number) REFERENCES student_info(number)
);

这样,在对 student_score 表插入数据的时候,MySQL 都会为我们检查一下插入的学号是否能在 student_info 表中找到,如果找不到则会报错

AUTO_INCREMENT属性

简称自增,如果把一个列是类型是整数类型或浮点数类型,这个列就可以设置 AUTO_INCERMENT 属性;当我们设置该属性后,插入记录时,没有指定该列的值时,或者将该列的值显式地指定为 NULL 或者 0,那么新插入的记录在该列上的值就是当前该列的最大值加 1 后的值

shell
mysql> CREATE TABLE first_table (
    ->     id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    ->     first_column INT,
    ->     second_column VARCHAR(100) DEFAULT 'abc'
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql>

定义列自增属性时,需要注意:

  • 一张表最多只能设置一个自增属性列
  • 具有 AUTO_INCREMENT 属性的列必须建立索引。主键和具有 UNIQUE 属性的列会自动建立索引。
  • 拥有 AUTO_INCREMENT 属性的列就不能再通过指定 DEFAULT 属性来指定默认值。
  • 一般拥有 AUTO_INCREMENT 属性的列都是作为主键的属性,来自动生成唯一标识一条记录的主键值。

列的注释

在建表语句的末尾可以添加 COMMENT 语句来给表添加注释,其实我们也可以在每一个列末尾添加 COMMENT 语句来为列来添加注释

shell
CREATE TABLE first_table (
    id int UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
    first_column INT COMMENT '第一列',
    second_column VARCHAR(100) DEFAULT 'abc' COMMENT '第二列'
) COMMENT '第一个表';

标识符的命名

像数据库名、表名、列名、约束名称或者我们之后会遇到的别的名称,这些名称统统被称为标识符

  • 名称不能是数字,数据库自己使用数字,不能有效的查询到
  • 名称中不能有空白符,如果存在会被当做两个词处理,造成歧义
  • 名称中不能使用 MySQL 保留字

但是如果你坚持要使用有歧义的名词,可以使用反引号 ```` 来将定义的名称扩起来,这样 MySQL 的服务器就能检测到你提供的是一个名称而不是别的什么东西

shell
CREATE TABLE `first_table` (
    `id` int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `first_column` INT,
    `second_column` VARCHAR(100) DEFAULT 'abc'
);