4.1 概念
- 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据;
- 目的:保证数据库中数据的正确、有效性和完整性;
4.2 主键约束
-
关键词:PRIMARY KEY
-
描述:主键是一行数据的唯一标识,保证一列或多列中的值唯一、非空且永不改动。
-
条件:
- 主键列的任意两行都不相同;
- 主键列的每一行都有值,不允许NULL值;
- 主键列的值从不修改或更新;
- 主键值不重复使用,删除某一行也不能把主键分配给新行。
-
添加:
# 方法一 CREATE TABLE 表名( 字段1 类型 PRIMARY KEY, 字段2 类型, …… PRIMARY KEY(字段1, 字段2...) ); # 方法二 ALTER TABLE 表名 ADD PRIMARY KEY(字段1, 字段2...);
-
删除:
ALTER TABLE 表名 DROP PRIMARY KEY;
4.3 自增长约束
-
关键词:AUTO_INCREMENT
-
描述:每增长一条记录,自增长列会自动以相同的步长进行增长。
-
条件:
- 默认情况下,AUTO_INEREMENT的初始值是1,每新增一条记录,字段值自动加1;
- 一个表只能有一个字段使用AUTO_INEREMENT约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分或有唯一约束);
- 自增长约束的字段只能是整数类型(TINYINT \ SMALLINT \ INT \ BIGINT等);
- 自增长约束字段的最大值受该字段的数据类型约束,如果达到上限,自增长约束就会失效。
-
添加:
# MySQL CREATE TABLE 表名( 字段 类型 AUTO_INCREMENT ) [AUTO_INCREMENT = 初始值]; # SQL server CREATE TABLE 表名( 字段 类型 identity(起始值,自增值) );
-
注意:插入数据时发生错误后,再次插入数据时自增列将不连续,而是在上一列加2:
4.4 外键约束
-
关键词:FOREIGN KEY
-
描述:保证引用完整性的极其重要部分。
-
条件:
- 外键值必须在另一个表的主键列中;
- 外键值可以为NULL值;
- 一个表可以有一个或多个外键;
- 如果从主表删除某条记录时,需要先删除外键表的记录;
- 外键中列的数据类型必须和主键列的数据类型相同。
-
添加:
# 方法一:创建表时指定 CREATE TABLE 表名( 字段 类型 [CONSTRAINT 外键名] FOREIGN KEY(字段) REFERENCES 主键表(主键列) ); # 方法二:对已有表添加 ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(字段) REFERENCES 主键表(主键列);
-
删除:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
-
同步更新行为:
- CASCADE
- 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
- SET NULL
- 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该表值为null。
- 使用方法:在设置外键后面添加
- ON UPDATE 更新行为
- ON DELETE 更新行为
- CASCADE
4.5 唯一约束
-
关键词:UNIQUE
-
描述:保证一列或多列中的数据是唯一的,类似主键,但有区别。
-
条件:
- 表可以包含多个唯一约束,但每个表只允许一个主键;
- 唯一约束列可以包含NULL值(只能出现一次,唯一的NULL也算唯一值);
- 唯一约束列的值可重复使用;
- 与主键不一样,唯一约束不能用来定义外键。
-
添加:
# 方法一 CREATE TABLE 表名( 字段 类型 UNIQUE ); # 方法二 CREATE TABLE 表名( 字段 类型, [CONSTRAINT 约束名] UNIQUE(字段) ); # 方法三 ALTER TABLE 表名 ADD [CONSTRAINT 约束名] UNIQUE(字段);
-
删除:
ALTER TABLE 表名 DROP CONSTRAINT 约束名; ALTER TABLE 表名 DROP INDEX 字段;
4.6 检查约束
-
关键词:CHECK
-
描述:保证一列或多列中的数据满足指定的条件。
-
条件:
- 检查最小或最大值;例如,防止0个物品的订单(即使0是合法的数)。
- 指定范围;例如,保证发货日期大于等于今天的日期,但不超过今天起一年后的日期。
- 只允许特定的值。例如,在性别字段中只允许M或F。
-
添加:
# 方法一 CREATE TABLE 表名( 字段 类型, CHECK(条件表达式) ); # 方法二 ALTER TABLE 表名 ADD CONSTRAINT 约束名 CHECK(条件表达式);
-
删除:
ALTER TABLE 表名 DROP CONSTRAINT 约束名;
4.7 默认值约束
-
关键词:DEFAULT
-
描述:指定某列的默认值,插入数据时如果没有指定值则使用默认值。
-
条件:
- 默认约束通常用在已经设置了非空约束的列。
-
添加:
# 方法一 CREATE TABLE 表名( 字段 类型 DEFAULT 默认值 ); # 方法二:MySQL ALTER TABLE 表名 CHANGE COLUMN 字段 类型 DEFAULT 默认值; # 方法二:SQL server ALTER TABLE 表名 ADD CONSTRAINT 约束名 DEFAULT 默认值 FOR 字段;
-
删除:将默认值设置为空null
# MySQL ALTER TABLE 表名 CHANGE COLUMN 字段 字段 类型 DEFAULT NULL; # 方法二:SQLserver ALTER TABLE 表名 ADD CONSTRAINT 约束名 DEFAULT NULL FOR 字段;
4.8 非空约束
-
关键词:NOT NULL
-
描述:指定字段的值不能为空。
-
添加:
CREATE TABLE 表名( 字段 类型 NOT NULL ); ALTER TABLE 表名 CHANGE 字段 字段 类型 NOT NULL; ALTER TABLE 表名 MODIFY 字段 类型 NOT NULL;
-
删除:
ALTER TABLE 表名 CHANGE 字段 字段 类型 NULL; ALTER TABLE 表名 MODIFY 字段 类型 NULL;
4.9 查看表中的约束
# 显示表结构
DESC 表名;
# 显示创建表语句
SHOW CREATE TABLE 表名;