列的属性是指当前列的数据符合哪些规则,列的属性一般在创建表的时候就指定好了,也可以在创建表后通过sql
语句再进行修改,常见的列的属性有:
- 默认值;
NOT NULL;
UNIQUE;
AUTO_INCREMENT;
ZEROFILL;
1、默认值属性(DEFAULT)
向表中添加数据时是按行去添加的,即一行一行地添加,可以一行添加,也可以批量多行添加,但基本单位是行。向表中添加行数据时是可以指定仅添加部分列的数据的,那些没有被指定添加的列默认会用NULL
去填充数据,也可以通过默认值属性给列一个非NULL
的默认初始化值。
格式:
CREATE TABLE first_table (
列名 列的数据类型 DEFAULT 默认值,
...
);
2、NOT NULL
属性
有时候我们需要要求表中的某些列中必须有值,不能存放NULL
,可以通过**NOT NULL**
属性对列进行设置。
格式:
CREATE TABLE first_table (
列名 列的数据类型 NOT NULL,
...
);
3、UNIQUE
属性
先介绍一下主键的概念,再介绍UNIQUE属性,最后介绍一下外键的概念。
3.1 主键(PRIMARY KEY)
对于一张表,我们可以通过某个列或者某些列来唯一确定表中的一条记录,这个列或者这些列称为表的候选键,一张表可以有多个候选键。
从表的所有候选键中选出一个作为表的主键,通过主键可以在表中找到唯一的一条记录,主键的特点有:
- 一个表最多能有一个主键,可以没有主键;
- 主键默认是
NOT NULL
属性; - 主键可以是一个列,也可以是一组列。
格式:
CREATE TABLE 表名 (
列名 列的数据类型 PRIMARY KEY,
...
);
CREATE TABLE 表名 (
列名1 列1的数据类型,
列名2 列2的数据类型,
...
PRIMARY KEY(列名1, 列名2)
);
一般在创建表的时候指定表中的主键列,MySQL
会对我们插入的记录做校验,如果新插入记录的主键值已经在表中存在了,那就会报错。
3.2 UNIQUE
属性
对于不是主键的列,我们也想赋予它独一无二的含义,即向表中插入数据时会检查一下该列的值是否有重复,有重复会报错,我们可以给这个列或者这组列添加UNIQUE
属性,表明该列或者这组列的值是不允许重复的,同样是在创建表的时候赋予列UNQUE属性。
格式:
CREATE TABLE 表名 (
列名 列的数据类型 UNIQUE,
...
);
也可以把需要赋予UNIQUE
属性的一组列单独提取出来,相当于为表添加了一个UNIQUE
约束(UNIQUE KEY
),每个约束都可以有个名字与之对应,称为约束名。
格式:
CREATE TABLE student_info (
...
UNIQUE KEY 约束名 (需要被赋予UNIQUE属性的列的集合,用逗号隔开)
);
举例:
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,
UNIQUE KEY uk_id_number (id_number)
);
主键和UNIQUE约束的区别:
- 一张表只能有最多一个主键,却可以有多个
UNIQUE
约束; - 主键列不允许存放NULL,而声明了
UNIQUE
属性的列可以存放NULL
,而且NULL
可以重复地出现在多条记录中。3.3 外键(FOREIGN KEY)
3.3.1 外键的使用
什么是外键:如果A表中的某个列或者某些列依赖于B表中的某个列或者某些列,那么就称A表为子表,B表为父表。子表和父表可以使用外键来关联起来。一般在创建表的时候声明外键。
外键的作用:关联子表和父表,当向子表中插入数据时,MySQL都会检查插入数据的外键列对应的值是否能在父表中对应的外键列找到,如果找不到会报错。
格式:
举例:CONSTRAINT [外键名称] FOREIGN KEY(列1, 列2, ...) REFERENCES 父表名(父列1, 父列2, ...)[外键级联];
学生基本信息表
学号 | 姓名 | 性别 | 身份证号 | 学院 | 专业 | 入学时间 |
---|---|---|---|---|---|---|
20180101 | 杜子腾 | 男 | 158177199901044792 | 计算机学院 | 计算机科学与工程 | 2018/9/1 |
20180102 | 杜琦燕 | 女 | 151008199801178529 | 计算机学院 | 计算机科学与工程 | 2018/9/1 |
20180103 | 范统 | 男 | 17156319980116959X | 计算机学院 | 软件工程 | 2018/9/1 |
20180104 | 史珍香 | 女 | 141992199701078600 | 计算机学院 | 软件工程 | 2018/9/1 |
学生成绩表
学号 | 科目 | 成绩 |
---|---|---|
20180101 | 母猪的产后护理 | 78 |
20180101 | 论萨达姆的战争准备 | 88 |
20180102 | 母猪的产后护理 | 100 |
20180102 | 论萨达姆的战争准备 | 98 |
20180103 | 母猪的产后护理 | 59 |
20180103 | 论萨达姆的战争准备 | 61 |
20180104 | 母猪的产后护理 | 55 |
20180104 | 论萨达姆的战争准备 | 46 |
上面的例子中,学生成绩表中学号列依赖于学生基本信息表中的学号列,那么学生成绩表就是一个子表,学生基本信息表就是一个父表,MySQL语句如下:
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
表中找到,如果找不到则会报错。
说明:
- number只是碰巧在student_info表和student_score表里都是这个列名,实际可能在student_info表中对应num列,在student_score表里对应number列,列名是要看各自表中的列名的;
-
3.3.2 外键级联
上面介绍外键的写法时,在最后面跟了个可选项:外键级联,这里介绍以下外键级联的用途和使用方式。
通过外键的方式相当于将两张表的多组列之间建立的联系,因此在修改父表或者子表时要考虑是否会影响到外键对应的列,此时就需要外键级联去细粒度地指定这种情况的应对措施,这里列出外键级联最常使用的2个场景: 父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;
- 父表更新时子表也更新,父表删除时子表匹配的项也删除。
先介绍一下外键级联的使用方式:
[ON DELETE reference_option]
[ON UPDATE reference_option]
其中reference_option
是指在对应场景下的应对措施,有以下5种:
**CASCADE**
:从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。ON DELETE CANSCADE
和ON UPDATE CANSCADE
都被InnoDB所支持;**SET NULL**
:从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持;**NO ACTION**
:InnoDB拒绝删除或者更新父表;**RESTRICT**
:拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的;**SET DEFAULT**
: InnoDB目前不支持。
现在对应上面介绍的2个外键级联使用场景,外键级联方式如下:
- 父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败:
ON UPDATE CASCADE ON DELETE RESTRICT
; 父表更新时子表也更新,父表删除时子表匹配的项也删除:
ON UPDATE CASCADE ON DELETE CASCADE
。4、
AUTO_INCREMENT
属性自增属性,比如id列,将id列设置为自增属性后,插入数据时即使不声明id列的数据,也会按自增的顺序自动插入数据,,也是在创建表的时候添加AUTO_INCTEAMENT属性。
格式:列名 列的类型 AUTO_INCREMENT[=N]
说明:
可以通过AUTO_INCREMENT=N来设置自增的初始步长,且缺省是默认为1。
举例:
CREATE TABLE IF NOT EXISTS test_table (
id INT AUTO_INCREMENT=5 PRIMARY KEY ,
name VARCHAR(30),
age INT
) COMMENT 'AUTO_INCREAMENT';
插入数据时,id列的数据即使为NULL,MySQL也会为列自动插入递增后的数据。
AUTO_INCREAMENT属性注意的点:
- 一个表中最多有一个具有
AUTO_INCREMENT
属性的列; - 具有
AUTO_INCTREAMENT
属性的列必须建索引; - 具有
AUTO_INCREAMENT
属性的列不能再指定为DEFAULT
属性; - 一般拥有
AUTO_INCREMENT
属性的列都是作为主键的属性,来自动生成唯一标识一条记录的主键值。5、
ZEROFILL属性用来美化数据的显示,比如3、003、0003等。ZEROFILL
属性6、列的注释
给具体列添加注释。
格式:
列名 列的数据类型 COMMENT '列的注释';