1. CONSTRAINT 约束
创建表时,可以给表的字段添加约束,可以保证数据的完整性、有效性。比如大家上网注册用户时常见的:用户名不能为空。对不起,用户名已存在。等提示信息。
约束包括:
- 非空约束:not null
- 检查约束:check
- 唯一性约束:unique
- 主键约束:primary key
- 外键约束:foreign key
1.1 NOT NULL 非空约束
语法格式:
create table t_stu(no int,name varchar(255) not null,age int
);
name字段不能为空。插入数据时如果没有给name指定值,则报错。
1.2 CHECK 检查约束
create table t_stu(no int,name varchar(255),age int,check(age > 18)
);
1.3 UNIQUE 唯一性约束
1.3.1 列级唯一约束
#语法格式:
create table t_stu(no int,name varchar(255),email varchar(255) unique
);
1.3.2 表级唯一约束:
使用表级约束可以为多个字段添加联合唯一约束。
create table t_stu(no int,name varchar(255),email varchar(255),unique(name,email)
);
1.4 FOREIGN KEY 外键
- .外键的键名中建议包含一个 fk 字段以一目了然这是个外键,如 t_school_schno_fk 。
- 添加了外键约束的字段中的数据必须来自其他表的字段。
- 假设给a字段添加了外键约束,要求a字段中的数据必须来自b字段,b字段不一定是主键,但至少要有唯一性。例如学生表中引用的学校号 schno,在学校表中,这个字段的所有值都是唯一的
- 外键约束可以给单个字段添加,叫做单一外键。也可以给多个字段联合添加,叫做复合外键。复合外键很少用。
- a 表如果引用 b 表中的数据,就把 b 表叫做父表,把 a 表叫做子表。
- 创建表时,先创建父表,再创建子表。
- 插入数据时,先插入父表,在插入子表。
- 删除数据时,先删除子表,再删除父表。
- 删除表时,先删除子表,再删除父表。
创建约束时也可以给约束起名字,将来可以通过约束的名字来删除约束:
create table t_school( schno int primary key, sname varchar(255)
);
create table t_student( stuno int primary key, name varchar(255), age int, schno int, #创建一个外键constraint t_school_sno_fk foreign key(schno) references t_school(schno)
);
1.4.1 级联操作
CASCADE关键字,可以令父表发生变化时,子表相应做出变化
- 级联删除
创建子表时,外键可以添加:on delete cascade,这样在删除父表数据时,子表会级联删除。谨慎使用。
create table t_student( no int primary key, name varchar(255), age int, sno int, constraint t_school_sno_fk foreign key(sno) references t_school(sno) on delete cascade
);
- 级联更新
create table t_student( no int primary key, name varchar(255), age int, sno int, constraint t_school_sno_fk foreign key(sno) references t_school(sno) on update cascade
);
- 级联置空
create table t_student( no int primary key, name varchar(255), age int, sno int, constraint t_school_sno_fk foreign key(sno) references t_school(sno) on delete set null
);
1.5 PRIMARY KEY 主键
1.6
- 创建约束时也可以给约束起名字,将来可以通过约束的名字来删除约束:
create table t_stu(no int,name varchar(255),email varchar(255),constraint t_stu_name_email_unique unique(name,email)
);
- 所有的约束都存储在一个系统表当中:table_constraints。这个系统表在这个数据库当中:information_schema