Part 05 MySQL数据库约束
1838字约6分钟
2024-12-10
1 约束
约束是数据的限制语法,确保表数据的准确性、可靠性和正确性。
约束可以在创建表时直接添加,也可以在创建边完成后通过 ALTER TABLE
语句添加。
约束按照作用范围可以分为三类:
域级约束
域级约束只对当前字段有效果。
如非空约束
NOT NULL
、默认值约束DEFAULT
、检查约束CHECK
。实体级约束
实体类约束规定同一表中的所有行数据。如某字段的值不能重复等。
如主键约束
PRIMATIVE KEY
、唯一约束UNIQUE
、自增长约束AUTO_INCREAMENT
。引用级约束
引用级约束规定多个表的数据。
如外键约束
FOREIGN KEY
。
2 域级约束
2.1 非空约束
非空约束限定某个字段的值不能为空。
非空约束只能添加到列上,且一个表中只能有多个列进行非空约束。
空字符串不是 NULL
,数字0也不是 NULL
。
-- 创建表时添加
CREATE TABLE <表名>(
<字段名> <数据类型> NOT NULL
);
-- 创建表后修改
ALTER TABLE <表名> MODIFY <字段名> <数据类型> NOT NULL;
-- 删除非空约束
ALTER TABLE <表名> MODIFY <字段名> <数据类型> NULL;
-- 或者
ALTER TABLE <表名> MODIFY <字段名> <数据类型>;
2.2 默认值约束
默认值约束给某个字段添加默认值,当插入数据时没有显式赋值就会赋予默认值。
默认值约束不能添加到唯一约束或主键约束的字段上,且添加的默认值的数据类型应该与字段相同。
-- 创建表时添加
CREATE TABLE <表名>(
<字段名> <数据类型> DEFAULT <默认值>
);
-- 创建表后修改
ALTER TABLE <表名> MODIFY <字段名> <数据类型> DEFAULT <默认值>;
-- 如果这个字段原来有非空约束,则在添加默认值约束时还需要同时保留非空约束
ALTER TABLE <表名> MODIFY <字段名> <数据类型> DEFAULT <默认值> NOT NULL;
-- 删除默认约束
ALTER TABLE <表名> MODIFY <字段名> <数据类型>;
-- 同样地,如果想要保留非空约束
ALTER TABLE <表名> MODIFY <字段名> <数据类型> NOT NULL;
2.3 检查约束
检查约束检查某个字段的值是否符合要求。
检查约束可以自定义表达式,但是出于性能问题不建议使用,而是在程序写入数据库时进行限制。
检查约束在MySQL 8.0+后被支持。
-- 创建表时添加
CREATE TABLE <表名>(
<字段名> <数据类型>,
CHECK(<表达式>)
);
-- 创建表后修改
ALTER TABLE <表名> ADD CONSTRAINT <约束名> CHECK(<表达式>); -- 约束名不能重复
-- 删除检查约束
ALTER TABLE <表名> DROP CONSTRAINT <约束名>;
3 实体级约束
3.1 唯一约束
唯一约束限定某个字段或者多个字段的值在表中的数据唯一。
同一个表中可以有多个唯一约束。唯一约束允许字段为空。
在创建唯一约束时如果不给唯一约束命名,就默认和列名相同。
-- 创建表时添加
CREATE TABLE <表名>(
<字段名> <数据类型> UNIQUE,
<字段名> <数据类型> UNIQUE KEY
);
-- 或者
CREATE TABLE <>(
<字段名> <数据类型>,
[CONSTRAINT 约束名] UNIQUE KEY (<字段名>, ...);
);
-- 创建表后添加
ALTER TABLE <表名> ADD CONSTRAINT <约束名> UNIQUE(<字段名>, ...);
-- 删除唯一约束
ALTER TABLE <表名> DROP CONSTRAINT <约束名>;
3.2 主键约束
在任何情况下,应该确保表中的记录中至少有一列非空且唯一。例如学号、编号、身份证号等。
主键分为自定义主键和自然主键两种,自定义主键是人为创建的一列专门用来做主键,自然主键是记录自带的一列非空唯一数据。为了不造成未知的问题,推荐使用自定义主键。
一张表中只能有一个主键,主键可以由单列或者多列构成。主键字段可以是任意数据类型,只需要保证非空唯一即可。
主键命名时一般以 _id
结尾。
-- 创建表时添加
CREATE TABLE <表名>(
<字段名> <数据类型> PRIMARY KEY
);
-- 或者
CREATE TABLE <表名>(
<字段名> <数据类型>,
[CONSTRAINT <约束名>] PRIMARY KEY(<字段名>, ...)
);
-- 创建表后添加
ALTER TABLE <表名> ADD PRIMARY KEY(<字段名>, ...);
-- 删除主键约束。删除主键约束后,非空约束仍然存在,但唯一约束消失。
ALTER TABLE <表名> DROP PRIMARY KEY;
3.3 自增长约束
自增长约束限定某个整数字段,插入数据时其值自动增长。
自增长约束只能添加到整数类型的主键约束或唯一约束的字段,且每张表只能有一个自增长约束。
如果给自增长约束的字段赋值为 0
或者 NULL
,则会自增赋值。如果为非零或者非空数据,则将设置为真实值。
-- 创建表时添加
CREATE TABLE <表名>(
<字段名> <数据类型> PRIMARY KEY AUTO_INCREMENT
);
-- 或者
CREATE TABLE <>(
<字段名> <数据类型> UNIQUE KEY AUTO_INCREMENT
);
-- 创建表后修改
ALTER TABLE <表名> MODIFY <字段名> <数据类型> AUTO_INCREMENT;
-- 删除自增长约束
ALTER TABLE <表名> MODIFY <字段名> <数据类型>;
--
4 引用级约束
4.1 外键约束
一个表中的一个字段是其他表的主键,称之为外键。外键的值应当对应其主键的值。
一个表中可以有若干个外键。外键引用的表称为主表,而外键所在的表称为字表。外键的数据类型应该与主键类型相同。
当存在主外键关系时,删除主表数据可能会因为子表的外键引用而删除失败,因此需要先删除子表的外键引用再删除主键数据。
-- 创建表时添加。在创建子表前需要先创建主表
CREATE TABLE <子表名>(
<字段名> <数据类型> PRIMATY KEY,
[CONSTRANT <约束名>] FOREIGN KEY (<外键字段名>) REFERENCES <主表名>(<主键字段名>) [级联动作];
);
-- 创建表后添加
ALTER TABLE <子表名> ADD [CONSTRAINT <约束名>] FOREIGN KEY <外键字段名> REFERENCES <主表名>(<主键字段名>) [级联动作];
-- 删除外键约束。分为两步,先删除约束,再删除索引。
ALTER TABLE <子表名> DROP FOREIGN KEY <约束名>;
ALTER TABLE <子表名> DROP INDEX <索引名>;
在添加外键约束时,可以设置级联动作。级联动作用来规定当主键发生更新或删除操作时,子表引用的外键数据应该做出何种变化。
级联动作的关键字为 ON UPDATE <约束等级> ON DELETE <约束等级>
。
约束等级 | 作用 |
---|---|
CASCADE | 在主表上更新或删除记录时,同步更新或删除子表记录。 |
SET NULL | 在主表上更新或删除记录时,将子表上匹配记录的字段设置为 NULL 。但是需要注意子表的外键不能有非空约束。 |
NO ACTION | 如果子表中有匹配的记录,则不允许对主表中的记录进行更新或删除操作。 |
RESTRICT | 默认值。同NO ACTION。 |
SET DEFAULT | 在主表上更新或删除记录时,将外键设置为默认值。 |
推荐使用 ON UPDATE CASCADE ON DELETE RESTRICT
方式。