数据库约束简介
- 约束(constraint),实际上就是表中数据的限制条件。表在设计时加入约束的目的就是为了保证表中的记录完整和有效
- MySQL数据库中的约束包括:
- 主键约束
- 外键约束
- 唯一约束
- 非空约束、空值约束
- 默认值约束
主键约束(PRIMARY KEY)
通过数据表中的一个或多个属性能够标识表中的唯一一行记录,这一个或多个属性称为该表的主键(一个表只能有一个主键)
-
主键约束的作用:
- 定义为主键的属性不允许为空
- 定义为主键的属性不允许输入重复值
- 定义主键约束时,会在主键列自动创建索引,加快对主键的查询速度
-
主键约束可以在定义表时设置,分为列级约束和表级约束
- 列级约束:
CREATE TABLE test_table1 ( id INT PRIMARY KEY, name VARCHAR(20), age INT );- 表级约束(如果主键由多个属性组成,则必须定义为表级约束):
CREATE TABLE test_table1 ( id INT, name VARCHAR(20), age INT, PRIMARY KEY(id,name) ); -
主键约束也可以在修改表时添加
- 语法:
ALTER TABLE 表名 ADD CONSTRAINT PRIMARY KEY(属性名)
- 语法:
-
主键约束在不被使用时,可以从表中删除
- 语法:
ALTER TABLE 表名 DROP PRIMARY KEY
- 语法:
外键约束(FOREIGN KEY)
建立和强调两个表之间的关联,确保数据的完整性和一致性
-
例如:
- A表中的属性是另外一个B表中能够唯一确定一行记录的键,A表和B表通过这个属性可以建立关联,这个属性就称为A表的外键,其中B表被称为主表或外表,A表称为从表或子表(子表中的外键可以有多个)
-
外键约束的作用:
- 主表中被子表外键关联的属性进行更新或删除操作,会关联到子表中的外键属性
- 子表中的外键属性输入的数据必须是主表中被关联属性已有的值
- 子表中的外键属性与主表中的被关联属性数据类型要一致
-
外键约束的使用限制:
- 主表必须已经存在
- 主表中的主键或唯一键才能作为子表的外键关联属性
- 定义外键约束的表类型必须是InnoDB,只有InnoDB类型的表才支持外键
- 对于非InnoDB表,外键约束会被忽略
外键约束可以在定义表时设置,但只能定义为表级约束
CREATE TABLE test_table2
(
id INT,
name VARCHAR(20),
FOREIGN KEY(id) REFERENCES test_table1(id) ON DELETE CASCADE ON UPDATE CASCADE
);
-
ON DELETE/ON UPDATE指明主表中对主键进行删除/更新操作时,子表相应的动作,不指定则表示主表不能进行删除/更新操作 -
CASCADE:表明子表中外键字段值也会被更新或删除 -
SET NULL:父表更新或删除时,子表字段值设置为NULL -
NO ACTION:父表更新或删除时,子表进行不了任何操作 - 定义外键约束时可以为约束起名(因为一张表中可能存在多个外键,删除时需要通过名称删除)
CREATE TABLE test_table2
(
id INT,
CONSTRAINT fk FOREIGN KEY(id) REFERENCES test_table1(id) ON DELETE CASCADE ON UPDATE CASCADE
);
-
当没有主动为外键约束起名时,MySQL会自动给外键起名,外键名称可以在系统表
information_schema.table_constraints中查看
image.png -
外键约束也可以在修改表时添加
- 语法:
ALTER TABLE 子表名 ADD CONSTRAINT fk FOREIGN KEY 子表名(属性名) REFERENCES 主表名(属性名);
- 语法:
-
外键约束在不被使用时,可以从表中删除
- 语法:
ALTER TABLE 表名 DROP FOREIGN KEY fk;
- 语法:
唯一约束(UNIQUE KEY)
确保不是主键的属性不会出现重复数据
-
唯一约束与主键约束的区别:
- 一个表只能定义一个主键约束,但是可以定义多个唯一约束
- 主键约束不允许属性值为空,而唯一性约束的属性允许为空
- 定义唯一约束时,同样会在属性列上自动创建索引,加快查询速度
-
唯一约束可以在定义表时设置(关键字KEY可省略),分为列级约束和表级约束
- 列级约束:
CREATE TABLE test_table ( id INT PRIMARY KEY, name VARCHAR(20) UNIQUE KEY );- 表级约束(如果唯一约束由多个属性组成,则必须定义为表级约束):
CREATE TABLE test_table ( id INT PRIMARY KEY, name VARCHAR(20), UNIQUE KEY(id,name) ); 定义表级约束时,可以给约束起名(删除约束时通过名称删除):
CREATE TABLE test_table
(
id INT PRIMARY KEY,
name VARCHAR(20),
CONSTRAINT u1 UNIQUE KEY(id,name)
);
-
唯一约束也可以在修改表时添加
- 语法:
ALTER TABLE 表名 ADD CONSTRAINT u1 UNIQUE(属性名);
- 语法:
-
唯一约束在不被使用时,可以从表中删除(作为索引被删除)
- 语法:
DROP INDEX u1 ON 表名;
- 语法:
非空约束(NOT NULL)、空值约束(NULL)
确保属性列中的数据不能为空,如果没有明确指定非空约束,则默认允许为空
需要注意的是:空值和0或者长度为0的字符串含义不同
非空约束可以在定义表时设置,但只能定义为列级约束
CREATE TABLE test_table
(
id INT PRIMARY KEY,
name VARCHAR(20) NOT NULL
);
-
非空约束也可以在修改表时添加
- 语法:
ALTER TABLE 表名 MODIFY 属性名 VARCHAR(20) NOT NULL;
- 语法:
-
非空约束在不被使用时,可以从表中删除
- 语法:
ALTER TABLE 表名 MODIFY 属性名 VARCHAR(20) NULL;
- 语法:
默认值约束(DEFAULT)
即向表中插入数据时,如果用户没有明确给出属性的值,数据库会自动为该属性添加默认值
需要注意的是:如果同一个属性有默认值约束和其他约束,默认值要写在其他约束前面
默认值约束可以在定义表时设置,但只能定义为列级约束
CREATE TABLE test_table
(
id INT PRIMARY KEY,
name VARCHAR(20) DEFAULT "zhangsan" NOT NULL
);
-
默认值约束也可以在修改表时添加
- 语法:
ALTER TABLE 表名 MODIFY 属性名 VARCHAR(20) DEFAULT 默认值;
- 语法:
-
默认值约束在不被使用时,可以从表中删除
- 语法:
ALTER TABLE 表名 MODIFY 属性名 VARCHAR(20) DEFAULT NULL;
- 语法:
