MySQL约束


SQL 约束用于规定表中的数据规则。

如果存在违反约束的数据行为,行为会被约束终止。

约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。

对表中的数据进行限定,保证数据的正确性,有效性和完整性。

分类:

  • 主键:primary key
  • 非空约束:not null
  • 唯一约束:unique
  • 外键约束:foreign key
  • check

image.png

非空约束

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(学号)
);
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值