文章目录
SQL 约束用于规定表中的数据规则。
如果存在违反约束的数据行为,行为会被约束终止。
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。
对表中的数据进行限定,保证数据的正确性,有效性和完整性。
分类:
- 主键:
primary key
- 非空约束:
not null
- 唯一约束:
unique
- 外键约束:
foreign key
check
非空约束
not null
,值不能为空
创建表时添加非空约束
CREATE TABLE stu(
id INT,
name VARCHAR(20) NOT NULL
);
创建完表后,添加非空约束
alter table stu modify name VARCHAR(20) not null;
删除非空约束
ALTER TABLE stu MODIFY name VARCHAR(20);
唯一约束
unique
,值不能重复
创建表时添加唯一约束
CREATE stu(
id INT;
phone_number VARCHAR(20) UNIQUE
);
**注意:**MySQL 中,唯一约束限定的列的值可以有多个 null
。
给唯一约束起名 uq_cname
例如:
create table course(
课号 char(4) not null,
课名 char(20),
学分 int,
constraint uq_cname unique(课名)
);
创建表完后,添加唯一约束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
删除唯一约束
alter table stu drop index phone_number;
主键约束
primary key
- 非空且唯一
- 一张表只能有一个字段为主键
- 主键就是表中记录的唯一标识
创建表时
- 添加主键约束
create table stu(
id int primary key,
name varchar(20)
);
- 添加组合主键
create table stu(
id int,
name varchar(20),
primary key(id, name)
);
auto_increment
自动增长
对某个主键声明,则可以使其在添加数据的时候,自增
- 建表时,添加主键约束,并且完成主键自动增长
create table stu(
id int primary key auto_increment,
name varchar(20)
);
#自动增长会根据当前列的最后一行的值往后增加。
- 创建表完后,在添加自动增长
alter table stu modify id int auto_increment;
- 删除自动增长
alter table stu modify id INT;
-- 这样只会删除自动增长,主键删不掉。
- 有自增主键是插入数据:
如
create table stu (
id int not null primary key auto_increment,
name varchar(8)
);
三种方法:
- 将该自增主键设置为null
insert into stu values(null, "张三");
- 将该自增主键设置为0
insert into stu values(0, "张三");
- 插入时提前声明属性列
insert into stu(name) values("张三");
创建表完后,添加主键
alter table stu modify id int primary key;
删除主键
alter table stu drop primary key;
外键约束
foreign key
,表中存在一个字段指向另外一个表的主键,让表与表产生关系,从而保证数据的正确性
- 一张表可以有多个外键
- 外键用于约束表与表之间的关系,可以说外键是表之间的映射关系,这个关系可以帮助我们处理表之间关系的紧密性和存在性
比如:学生表的 cid 班级号与班级表的 id 建立关联,cid 应该不能为不存在的,如果不增加外键 cid,没有建立上关系,我们就不知道班级号不存在。
- 能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好
行为 | 说明 |
---|---|
no action | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键, |
如果有则不允许删除/更新。 (与 RESTRICT 一致) 默认行为 | |
restrict | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键, |
如果有则不允许删除/更新。(与 NO ACTION 一致) 默认行为 | |
cascade | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键, |
如果有,则也删除/更新外键在子表中的记录。(级联更新/删除) | |
set null | 当在父表中删除对应记录时,首先检查该记录是否有对应外键, |
如果有则设置子表中该外键值为null(这就要求该外键允许取null)。 | |
set default | 父表有变更时,子表将外键列设置成一个默认的值 (Innodb不支持) |
创建表时,添加外键
create table sc(
学号 char(4) not null,
课号 char(4) not null,
成绩 decimal(5,2) check(成绩 between 0 and 100),
primary key(学号,课号),
constraint fk_sno foreign key(学号) references stu(学号)
);
创建表之后,添加外键
alter table 表名 add [ constraint 外键名称 ] foreign key(外键字段名称) references 主表名称(主表列名称);
cascade
alter table 表名 add [ constraint 外键名称 ]foreign key(外键字段名称)
references 主表名称(主表列名称) on update cascade on delete cascade ;
例子:
对dept表更新/删除时,级联更新/删除emp表对应数据
alter table emp add constraint fk_emp_dept_id foreign key (dept_id)
references dept(id) on update cascade on delete cascade ;
set null
alter table 表名 add [ constraint 外键名称 ] foreign key(外键字段名称)
references 主表名称(主表列名称) on update set null on delete set null ;
例子:
对dept表更新/删除时,级联更新emp表对应数据为 null
alter table emp add constraint fk_emp_dept_id foreign key (dept_id)
references dept(id) on update set null on delete set null ;
删除外键
alter table 表名 drop foreign key 外键名称;
check
利用 check
可以对数值设置取值范围
例如:
create table sc(
学号 char(4) not null,
课号 char(4) not null,
成绩 decimal(5,2) check(成绩 between 0 and 100), # 0 ≤ 成绩 ≤ 100
primary key(学号,课号),
constraint fk_sno foreign key (学号) references stu(学号)
);