🍁博客主页:
👉@不会压弯的小飞侠
✨欢迎关注:
👉
点赞
👍
收藏
⭐
留言
✒
✨系列专栏:
👉MySQL数据库专栏
✨欢迎加入社区:
👉不会压弯的小飞侠
✨人生格言:知足上进,不负野心。
🔥
欢迎大佬指正,一起学习!一起加油!
🍁概述
约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:保证数据库中数据的正确、有效性和完整性。
分类
约束描述关键字非空约束限制该字段的数据不能为nullNOT NULL唯一约束保证该字段的所有数据都是唯一、不重复的UNIQUE主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY默认约束保存数据时,如果未指定该字段的值,则采用默认值DEFALLT检查约束(8.0.16版本之后)保证字段值满足某一个条件CHECK外键约束用来让两张表的数据之间建立连接,保证数据的一致性和完整性FOREIGN KEY案例分析
创建一个user表
字段名:id - 字段类型:int- 约束条件:主键,并且自动增长- 关键字:primary key,auto_increment
字段名:name - 字段类型:varchar(10)- 约束条件:不为空,并且唯一- 关键字:NOT NULL,UNIQUE
字段名:age - 字段类型:int- 约束条件:大于0,并且小于等于120- 关键字:CHECK
字段名:status - 字段类型:char(1)- 约束条件:如果没有指定该值,默认为1- 关键字:DEFAULT
字段名:gender - 字段类型:char(1)- 约束条件:无
注意:由于MySQL版本过低,本次年龄案例就不演示了。
如需要自行测试:
age intcheck( age >0&& age <=120)comment'年龄',
- 创建user表
createtableuser(
id intprimarykeyauto_incrementcomment'主键',
name varchar(10)notnulluniquecomment'姓名',statuschar(1)default'1'comment'状态',
gender char(1)comment'性别')comment'用户表';
- 创建成功
- 插入数据
age intcheck( age >0&& age <=120)comment'年龄',
- 数据插入成功
- 插入一条name为空的数据进行测试
insertintouser(name,status,gender)values(noll,'0','男');
- 插入一条name不唯一的数据进行测试
insertintouser(name,status,gender)values('jkj','0','男');
🍁外键约束
- 外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。
- 创建dept父表
createtable dept(
id intauto_incrementcomment'ID'primarykey,
name varchar(50)notnullcomment'部门名称')comment'部门表';
- 往dept父表中插入数据
INSERTINTO dept (id, name)VALUES(1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办');
- 创建emp子表
createtable emp(
id intauto_incrementcomment'ID'primarykey,
name varchar(50)notnullcomment'姓名',
age intcomment'年龄',
job varchar(20)comment'职位',
salary intcomment'薪资',
entrydate datecomment'入职时间',
managerid intcomment'直属领导ID',
dept_id intcomment'部门ID')comment'员工表';
- 往emp子表中插入数据
INSERTINTO emp (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,'开发',8400,'2000-11-03',2,1),(4,'刘五',48,'开发',11000,'2002-02-05',2,1),(5,'小七',43,'开发',10500,'2004-09-07',3,1),(6,'老八',19,'程序员',6600,'2004-10-12',2,1);
- 此时两表还没建立连接
🍁外键约束语法
- 添加外键 - 方式一
CREATETABLE 表名(
字段名 数据类型,.…
[CONSTRAINT][外键名称]FOREIGNKEY(外键字段名)REFERENCES 主表(主表列名));
- 方式二
ALTERTABLE 表名 ADDCONSTRAINT 外键名称 FOREIGNKEY(外键字段名)REFERENCES 主表(主表列名);
- 删除外键
ALTERTABLE 表名 DROPFOREIGNKEY 外键名称;
- 案例分析
- 添加外键
altertable emp addconstraint fk_emp_dept_id foreignkey(dept_id)references dept(id);
- 删除外键
altertable emp dropforeignkey fk_emp_dept_id;
🍁外键的删除和更新行为
行为说明NO ACTION当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与RESTRICT一致)RESTRICT当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与NO ACTION一致)CASCADE当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。SET NULL当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null)。SET DEFAULT父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持)
- 语法
ALTERTABLE表名 ADD CONSTRANT 外键名称 FOREIGNKEY(外键字段) REERENCES 主表名(主表字段名)ONUPDATE CSCADE ONDELETE CASCAOE;
- 案例分析:
- 以cascade 为例
altertable emp addconstraint fk_emp_dept_id foreignkey(dept_id)references dept(id)onupdatecascadeondeletecascade;
- 将研发部id改为6
- 此时子表中dept_id由1变成了6
- 将研发部id为6删除
- 此时子表就剩了一条数据
- 以SET NULL为例
altertable emp addconstraint fk_emp_dept_id foreignkey(dept_id)references dept(id)onupdatesetnullondeletesetnull;
- 将研发部id为1删除
- 此时子表中dept_id由1变成了null
版权归原作者 不会压弯的小飞侠 所有, 如有侵权,请联系我们删除。