约束是一种限制,它是对表中行和列的数据做出约束,确保表中数据的完整性和唯一性。
mysql中常见的约束主要分为以下6种,分别为:
1、主键(primary key):用于保证该字段值具有唯一性且非空,如员工编号;
2、唯一(unique):用于保证该字段的值具有唯一性但可以为空;
3、非空(not null):用于保证该字段的值不能为空;
4、默认(default):用于保证该字段有默认值,如性别;
5、外键(foreign key):用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。通过在从表中添加外键约束,用于引用主表中某列的值;
6、检查约束(check)--mysql中不支持
其他约束:
auto_increment:自增长约束
unsigned:无符号约束
zerofill:零填充约束--如果指定了int的位数(如6位),而此时的整型数据为11,通过添加zerofill约束,此时表中的数据为000011,即通过0来填充确保
一、什么时候添加约束?
一般在创建表或者修改表时添加约束。
【修改表时添加约束】
1、添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束
2、添加表级约束
alter table 表名 add [constraint 约束名] 约束类型(字段名) [外键的引用]
二、如何添加约束?
1、约束的添加主要分为以下两种方式,分别为:
(1)列级约束:6大约束在语法上都支持使用列级约束,但是通过列级约束创建的外键约束没有效果
(2)表级约束:除非空(not null)和默认(default)外,其他4种约束均支持通过表级约束来创建
2、语法结构:
表级约束:[constraint 约束名] 约束类型(字段名)
[constraint 约束名] 约束类型(从表字段名) references 主表(主表的关联列字段) -- 外键约束
1 create table 表名(
2 字段名1 字段类型 列级约束,
3 字段名2 字段类型 列级约束,
4 ......
5 字段名m 字段类型,
6 表级约束
7 )
【说明】
外键约束的约束名命名规范:fk_从表名_主表名
【实例】
三、常见面试题
1、主键约束和唯一约束的比较
| 是否保证唯一性 | 是否允许为空 | 同一个表中是否支持多个 | 是否允许组合 |
主键(primary key) | 是 | 否 | 否 | 是,但不建议使用 |
唯一(unique) | 是 | 是,但是只能有一个null | 是 | 是,但不建议使用 |
【关于是否允许组合的说明】
在使用表级约束为表中的数据添加约束条件时,可以将表中的字段名组合使用,如约束类型(字段名1,字段名2)
如:primary key(id,name),此时表中两条记录中只要id和name字段的值不同时相同,就能满足primary key的约束条件。如(1,'mary')和(1,'john')
2、外键约束的注意事项
(1)要求在从表中设置外键关系
(2)从表中外键列的类型和主表中关联列的类型要求一致或者类型兼容,对于字段名称无相关要求
(3)主表的关联列必须是一个key,一般是primary key或者unique
(4)在插入数据是,先插入主表,再插入从表;删除数据时,先删除从表,再删除主表(***)