mysql 学习9 约束-作用于表中字段上的规则,目的是保证数据的正确,有效性和完整性,约束关键字,外键约束
一 使用约束关键字创建表
create table user( id int primary key auto_increment comment '主键', name varchar(10) not null unique comment '姓名', age int check ( age>0 && age<=120 ) comment '年龄', status char(1) default '1' comment '状态', gender char(1) comment '性别' ) comment '用户表'; insert into user (name,age,status,gender) values ('zhangsan1',10,'0','男'),('zhangsan2',20,'1','男'),('zhangsan3',30,'1','男');
error1 我们指定了name 不能为null,当我们insert name 为 null 的时候,会报错:[23000][1048] Column 'name' cannot be null
insert into user (name,age,status,gender) values (null,10,'0','男');
error2 当我们添加zhangsan4的时候,指定年龄为121,就会报错,不会执行。[HY000][3819] Check constraint 'user_chk_1' is violated.
insert into user (name,age,status,gender) values ('zhangsan4',121,'0','男');
二 外键约束
添加外键
#为了外键,创建部门表 create table dept( id int auto_increment primary key comment 'ID', name varchar(50) not null comment '部门名称' ) comment '部门表'; #drop table dept; # 给部门表中插入数据 insert into dept (name) values ('研发部'),('市场部'),('财务部'),('销售部'),('总经办'); #为了外键,创建emphasdept 表,在创建的时候没有外键约束 create table emphasdept( id int auto_increment primary key comment 'ID', name varchar(50) not null comment '姓名', age int comment '年龄', job varchar(20) comment '职位', salary int comment '薪资', entrydate date comment '入职时间', managerid int comment '直属领导ID', dept_id int comment '部门ID' )comment '员工表'; #为了外键,给emphasdept 表 中插入数据 insert into emphasdept(id,name,age,job,salary,entrydate,managerid,dept_id) values (1,'金庸',66,'总裁',20000,'2000-01-01',null,5), (2,'张无忌',20,'项目经理',12500,'2005-12-05',1,1), (3,'杨潇',33,'开发',8800,'2006-07-08',2,1), (4,'韦一笑',48,'开发',11000,'2006-01-01',2,1), (5,'常遇春',43,'开发',10500,'2004-09-07',3,1), (6,'小昭',19,'程序员鼓励师',6600,'2004-10-11',2,1); # 为了外键,更新 emphasdept 表,设置 emphasdept表中的 dept_id为 foreign key,起名为 fk_emp_dept_id,这里给外键起名主要是在删除外键的时候要用,这个外键关联的表是dept,更具体的说是 关联的表是dept中的id这一列 alter table emphasdept add constraint fk_emp_dept_id foreign key(dept_id) references dept(id);
删除外键
#删除外键 alter table emphasdept drop foreign key fk_emp_dept_id;
外键在update 和delete 时的行为
我们从前面知道,添加外键的目的就是为了让数据完整,
默认情况下,如果要删除 dept 表的一项,但是 dept在 emphasdept表中是 作为外键存在的,删除时dept表中的一项时会不让删除,即我们下面学习的NO ACTION 和 RESTRICT 行为。
但是我们就是要在dept表中删除某一项,应该怎么办呢?mysql 提供了 cascade 和 set null 两种方案,
cascade 是在update 和delete的时候会将 emphasdept 表中对应的数据update 或者delete,
set null 是在 udpate 或者 delete的时候,会将emphasdept表中对应的数据设置为null,当然emphasdept中的foreign key 要可以设置为null才行。
alter table emphasdept add constraint fk_emp_dept_id foreign key(dept_id) references dept(id) on update cascade on delete cascade ;