赞
踩
在设计表的时候使用约束可以帮助维护表中记录的完整性和有效性
CREATE TABLE `student`(
`id` int PRIMARY KEY
);
CREATE TABLE `student`(
`id` int NOT NULL
);
CREATE TABLE `student`(
`id` int UNIQUE
);
CREATE TABLE `student`(
`id` int,
`studentId` int,
UNIQUE(`id`, `studentId`)
);
create table `student`(
`id` int,
`core` int DEFALUT 1
);
Mysql在Mysql8.0.16以后的版本才提供检查约束
特点:保证字段值满足某一个/多个条件
CREATE TABLE student(
`id` int,
`age` int CHECK(`age` > 0 && `age` <= 120)
);
CREATE TABLE `user`(
`id` int,
`age` int,
CHECK(`id` < 100 && `age` > 10)
)
-- 建表添加外键约束语法
[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]
--修改表添加外键约束语法
ALTER TABLE <数据表名> ADD CONSTRAINT <索引名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
-- 删除外键
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
阻止执行
① 从表插入新行,其外键值不是主表的主键值便阻止插入;
② 从表修改外键值,新值不是主表的主键值便阻止修改;
③ 主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);
④ 主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。
级联执行
① 主表删除行,连带从表的相关行一起删除。
② 主表修改主键值,连带从表相关行的外键值一起修改。
CREATE TABLE `user`(
`id` int PRIMARY KEY,
`name` char(50)
);
CREATE TABLE `student`(
`student_id` int PRIMARY KEY,
`class` int,
CONSTRAINT `fk` FOREIGN KEY (`student_id`) REFERENCES `user`(`id`)
);
INSERT INTO `user`
VALUES (1, "张三"),
(2, "李四"),
(3, "王五"),
(4, "赵六");
INSERT INTO `student`
VALUES (1, 1),
(2, 1),
(3, 2),
(4, 3);
@ 表1,user表
@ 表2,student表
1. 操作主表中将被外键约束的数据
UPDATE `user` SET `id` = 5 WHERE `name` = "张三"; -- SQL报错
2. 操作从表,将被约束的数据修改为主表中<不存在>的外键数据
UPDATE `student` SET `student_id` = 5 WHERE `class` = 3; -- SQL报错
3. 操作从表,将被约束的数据修改为主表中<存在>的外键数据
UPDATE `student` SET `student_id` = 4 WHERE `class` = 2; -- SQL语句通过
- Cannot delete or update a parent row: a foreign key constraint fails (
myDataBase
.student
, CONSTRAINTfk
FOREIGN KEY (student_id
) REFERENCESuser
(id
))
- Cannot add or update a child row: a foreign key constraint fails (
myDataBase
.student
, CONSTRAINTfk
FOREIGN KEY (student_id
) REFERENCESuser
(id
))
示例中的三条SQL演示了外键的工作方式中的第②、④点。
计算机科学中的级联指的是多个对象之间的映射关系,通过建立数据之间的级联关系可以提高管理效率
欢迎评论、交流,如若文中描述错误,敬请指导。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。