四、约束
约束(CONSTRAINTS)
数据完整性(Data Integrity)是指数据的精确性和可靠性。它是应 防止数据库中存在不符合 语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。数据的完整性要从以下四个方面考虑:
-
实体完整性:例如一个表中,不能出现两条完全相同,无法区分的记录
-
域完整性:例如,年龄范围0-120,性别范围"男/女";
-
引用完整性:例如,员工所在部分,在部门表中要能找到这个部门
-
用户自定义完整性:例如,用户名唯一,密码不为空等。
根据约束的特点,约束可以分为以下几类:
1、键约束:主键约束,外键约束,唯一键约束
2、Not Null 约束:非空约束
3、Check约束:检查约束
4、Default约束:缺省约束
查看某个表的约束和索引
SHOW INDEX FROM 表名; # 查看索引
SHOW CREATE TABLE 表名; # 查看约束
--------------------------------------------------------------------------------------------
主键约束 PRIMARY KEY
主键:PRIMARY KEY,简称PK,数据库主键作用是保证实体的完整性,可以是一个列或多列组合。每个表有且只允许一个主键约束。
主键约束相当于唯一约束 + 非空约束 的 组合,主键约束列不允许重复,也不允许出现空值,如果是多列组合的主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
建表时构建主键约束
-
单主键
-
主键列后加主键关键字
CREATE TABLE 表名(
字段名 类型 PRIMARY KEY AUTO_INCREMENT, # 设置自增长
)
-
单独声明主键约束
CREATE TABLE 表名(
字段名 类型,
PRIMARY KEY(字段名));
-
复合主键
-
CREATE TABLE 表名(
字段名1 类型,
字段名2 类型,
PRIMARY KEY(字段名1,字段名2)
);
建表后构建主键约束
-
单主键
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
-
复合主键
ALTER TABLE 表名 ADD PRIMARY KEY(字段名1,字段名2);
删除主键
ALTER TABLE 表名 DROP PRIMARY KEY; # 不需要指定主键名
---------------------------------------------------------------------------------------------
唯一键约束 UNIQUE KEY(UK)
特点:
-
同一个表可以有多个唯一约束
-
唯一约束可以是某一列的值唯一,也可以是多列组合值唯一
-
MYSQL会给唯一约束默认创建一个唯一索引
-
删除唯一键只能通过删除唯一索引的方式删除
建表时构建唯一约束
-
单唯一约束
-
在某个列后面直接加唯一约束
CREATE TABLE 表名(
字段名 类型 UNIQUE,
);
-
单独声明唯一约束
CREATE TABLE 表名(
字段名 类型,
UNIQUE(字段名));
-
复合唯一约束
-
CREATE TABLE 表名(
字段名1 类型,
字段名2 类型,
UNIQUE(字段名1,字段名2));
建表后构建唯一约束
-
单唯一约束
ALTER TABLE 表名 ADD UNIQUE(字段名);
-
多组合唯一约束
ALTER TABLE 表名 ADD UNIQUE(字段名1,字段名2);
唯一约束删除
ALTER TABLE 表名 DROP INDEX 唯一约束名;
---------------------------------------------------------------------------------------------
外键约束 FOREIGN KEY(FK)
特点:
-
外键约束是保证一个或两个表之间的参照性完整性
-
创建外键约束时,如果不给外键约束名称,会自动产生一个,也可以指定一个名字
-
创建外键约束时,系统默认会在列上建立对应的普通索引,但是索引名是列名
注意:
-
在从表上建立外键,而且主表要先存在
-
从表的外键列,只能引用主表的键列(主键列,唯一键列,外键列)
-
从表的外键列与主表被参照列名字可以不一样,但是数据类型必须一致
-
从表外键值必须在主表中能找到或者为空,从而约束了表的外键列的值的增和改
-
当主表被从表参照时,主表被参考的记录删除和更新也会受到限制
以下重要!!!!
-
默认情况下,主表和从表是严格依赖关系RESTRICT(约束,限制)。主表的记录不允许删除,如果要删除,需要先删除从表中相关的数据,才可以删除主表的数据
-
ON DELETE SET NULL(级联置空):当外键设置了SET NULL,当主表的相关记录删除时,从表对应字段的值改为NULL,当然,从表对应字段的值必须可以为NULL才行
-
ON DELETE CASECADE(级联删除):当外键设置了CASCADE,当主表的相关记录删除时,从表对应的行都删除了
-
对于外键约束来说,最好是采用:ON UPDATE CASCADE ON DELETE RESTRICT
建表时构建外键约束
-
CREATE TABLE 表名(
字段名 类型
CONSTRAINT 外键名 FOREIGN KEY(字段名) REFERENCES 主表名(主表字段)ON UPDATE CASCADE ON DELETE RESTRICT);
建表后构建外键约束
-
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(从表字段名) REFERENCES 主表名(主表字段) ON UPDATE CASCADE ON DELETE RESTRICT;
删除外键
-
ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;
删除外键列上的索引
-
ALTER TABLE 表名 DROP INDEX 索引名;
--------------------------------------------------------------------------------------------
非空约束 NOT NULL
规定某个字段不能为NULL
建表时构建非空约束
-
CREATE TABLE 表名(
字段名 类型 NOT NULL
);
建表后构建非空约束
-
ALTER TABLE 表名 MODIFY 字段名 NOT NULL;
--------------------------------------------------------------------------------------------
检查约束 CHECK
注意: MySQL不支持check约束,但可以使用check约束,而没有任何效果;
例如:age tinyint check(age >20) 或 sex char(2) check(sex in(‘男’,’女’))
--------------------------------------------------------------------------------------------
DEFAULT 缺省约束
在插入数据时某列如果没指定其他的值,那么会将默认值添加到新纪录中;
建表时构建缺省约束
-
CREATE TABLE 表名(
字段名 类型 DEFAULT NULL
);
建表后构建缺省约束
-
ALTER TABLE 表名 MODIFY 字段名 DEFAULT NULL;
---------------------------------------------------------------------------------------------
自增列:AUTO_INCREMENT
需要注意的点:
-
整数类型的字段才可以设置为自增
-
一个表最多只能有一个自增列
-
自增列必须非空,如果数据中有NULL值,必须把NULL值处理了才可以将该列设置为自增
-
自增列必须是主键列或者唯一键列
-
ALTER TABLE 表名 AUTO_INCREMANT = 100; # 设置起始自增数
-
TRUNCATE 表名; # 清除数据的同时,可以重置自增值
-
DELETE FROM 表名 [ WHERE 条件]; # 只能清除数据,不能重置自增值