在MySQL中,各种完整性约束是作为数据库关系模式定义的一部分。一旦定义了完整性约束,MySQL服务器会随时检测处于更新状态的数据库内容是否符合相关的完整性约束,从而保证数据的一致性与正确性。如此,既能有效地防止对数据库的意外破坏,又能提高完整性检测的效率,还能减轻数据库编程人员的工作负担。
一、数据的完整性
1. 分类
- 实体完整性:表的标识符列或主键的完整性。唯一性约束、主键约束、标识列属性。
- 参照完整性:保证键值在所有表中一致。不能引用不存在的值。
- 域完整性:数据类型、格式、可能值范围(外键约束、检查约束、非空约束、默认值约束)
- 用户自定义完整性
2. 语法
constraint 完整性约束条件名 [primary key | foreign key | check] 短语
二、字段约束
1. 主键约束
1.1 主键
用于保证数据库表中记录的唯一性。
1.2 注意
- 一张表中只能设置一个主键。
- 任何主键字段不允许为NULL。
1.3 设置主键
(1)设置单字段ID【列级完整性语法】
-- 定义表属性后
primary key (col_name)
-- 定义表属性时
col_name type [other options] primary key
(2)设置多字段ID【列级完整性语法】
-- 定义表属性后
primary key (col_name1, col_name2 ...)
(3)例子
1.4 修改主键
alter table table_name drop primary key, add primary key(col_name1, col_name2...)
2. 外键约束
2.1 外键:外键用来在两个表的数之间建立连接。
2.2 注意:
- 一个表可以有一个或多个外键。
- 子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配。
- 子表的外键字段取值,要么是NULL,要么是来自于父表的主键字段取值,不能存在其他值。
- InnoDB存储引擎支持外键约束,但MyISAM存储引擎不支持。
2.3 设置外键
(1)语法格式
--定义表时
col_name type [other options] references super_table(super_state)
-- 定义表后
foreign key [foreign_name] (state) references super_table(super_state)
-- 创建表后
alter table table_name add [constraint foreign_name] foreign key (state) references super_table(super_state) [ on delete {cascade | restrict | set null | no action} ] [ on update {cascade | restrict | set null | no action} ]
(2)参数说明
参数 | 说明 |
---|---|
foreign_name | 外键名 |
cascade | 删除或修改父表记录时,会自动删除或修改子表对应的记录 |
restrict | 与no action功能一致,为默认值 |
set null | 删除或修改父表记录时,会将子表中对应的外键值设置为NULL |
no action | 删除或修改父表记录时,若子表中存在与之对应的记录,则操作失败 |
(4)例子
3. 非空约束
3.1 语法格式
-- 定义表时:直接在数据类型后添加"not null"
create table table_name (
col_name type [other_options] not null;
);
-- 创建表后
alter table table_name modify col_name type not null;
3.2 注意
非空约束限制该字段的内容不能为空,但可以是空白。
4. 唯一性约束
4.1 唯一性约束要求该列的值唯一。
4.2 注意
- 唯一性的列允许为空,单只能出现一个空值。
- 一张表可以存在多个唯一性约束。
- 满足唯一性约束的字段值可以为NULL。
4.3 语法格式
-- 定义表时:直接在数据类型后添加"unique"
create table table_name (
col_name type [other_options] unique;
);
-- 创建表后
alter table table_name modify col_name type [other_options] unique;
4.4 例子
5. 默认值约束
-- 定义表时
create table table_name (
col_name type [other_options] default 默认值;
);
6. 自增约束
6.1 注意
- 一张表只能有一个字段使用自增约束,且该字段必须为主键的一部分。
- 自增约束的字段类型可为任意的整型。
6.2 设置自增
-- 定义表时
create table table_name (
col_name type [other_options] auto_increment;
);
7. 检查约束
检查约束可以检查数据表字段的有效性,如数值的限制。
前面的默认值约束和非空约束可看作是特殊的检查约束。
三、删除约束
alter table table_name drop [ primary key | foreign key 外键名];
参数说明:外键名可以通过显示表格详情查看(show create table table_name
)。
注:删除外键约束后,在desc之后会发现在key一列还会留下MUL
的字样,这个其实就是索引的意思。可以通过alter table table_name drop index 列名;
来进行删除,也可以通过alter table table_name add index(列名);
进行添加。