06 约束
一、约束是什么
在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中的数据合法性、有效性、完整性。
二、常见约束分类
-
非空约束(not null):约束字段不能为NULL
-
唯一约束(unique):约束的字段不能重复
-
主键约束(primary key):约束的字段既不能为NULL,也不能重复
-
主键的作用:
- 表的设计三范式有要求,第一范式就要求任何一张表都应该有主键。
- 主键是这行数据记录的唯一标识
-
主键分类
-
根据主键字段数量划分:
- 单一主键(常用,推荐)
- 复合主键(多个字段联合起来添加应该主键约束)(不推荐使用,违背三范式)
-
根据主键性质划分
- 自然主键:主键最好是一个与业务没有关系的自然数
- 业务主键:主键和系统的业务挂钩,例如:银行卡号,身份证号作为主键(不推荐使用)
-
-
-
外键约束(foreign key):
-
检查约束(check):注意:Oracle数据库支持check约束,MySQL目前不支持该约束。
三、主键的创建
-
使用列级约束方式定义主键
create table t_stu( id int primary key, no int, name varchar(64) );
-
使用表级约束方式定义主键
create table t_stu( id int, no int, name varchar(64), primary key(id) );
-
自然主键的创建一般联合
auto_increment
使用。create table t_stu( id int primary key auto_increment, no int, name varchar(64) );
四、外键约束
-
外键约束相关术语
- 外键约束:foreign key
- 外键字段:添加有外键约束的字段
- 外键值:外键字段中的每一个值
-
示例
<!-- 父表 --> t_class create table t_class( cno int, cname varchar(64), primary key(cno) ); <!-- 子表 --> t_stu create table t_stu( sno int, sname varchar(64), classno int, primary key(sno), foreign key(classno) references t_class(cno) ); insert into t_class values (100,'xxxxxxxx'); insert into t_class values (101,'yyyyyyyy'); insert into t_class values (102,'zzzzzzzz'); insert into t_stu values (1001,'zs1',101); insert into t_stu values (1002,'zs2',101); insert into t_stu values (1003,'zs3',102); <!-- 错误 --> insert into t_stu values (1004,'zs4',109);
-
注意:
- 用外键引用的表称为‘子表’,被引用的表称为‘父表’。
- 引用的外键字段可以不是主键,但必须有
unique
约束。 - 子表的外键只可以是NULL。