补12。关于mysql的外键约束

一、什么是mysql中的外键(froeign键)

假如说有两张表,其中一张表的某个字段指向了另一张表的主键,这就可以称之为外键(froeign键)。

在子表中增加一条记录时,需要确定是否有与父表相对应的记录。

如果父表没有对应的记录,那么子表(从表)无法插入这条数据。


下面是一个关于外键的示例:

1。首先创建一个主表,这个主表存放了班级信息。

创建表类(id非常小的整数主键auto_increment class_name varchar(20))引擎=innodb;

2。在类表中插入五条记录,代表有5个班级。

插入类(id、class_name)值(1“class1”), (2,“class2”), (3“class3”),(4,“一年级”),(5“class5”);

3。创建一个子表,这个子表存放了学生和班级的对应关系,这些学生属于哪个班级?

create table学生(int id主键auto_increment名字varchar (20), class_id非常小的整数)引擎=innodb;

4。插入6条记录,代表了6个学生。

插入学生(id、名称、class_id)值(1“stu1”2), (2“stu2”2), (3“stu3”1), (4,“stu4”, 3)、(5“stu5”1), (6“stu6”4);


现在的规则是,一个班级可以对应多个学生,但是一个学生只能属于一个班级。


5。增加外键约束。

接下来,为学生表增加一个外键约束。

alter table学生添加约束cls_stu外键(class_id)引用类(id);

#约束字段以类表的id字段为主。


6。测试外键约束是否生效。

刚刚我们创建班的课级表中一共有5个记录,也就是五个班级。(分别是class1 ~ class5)

现在学生表中,新增一个学生,这个学生属于一个类表中不存在的班级,班6级,看看会是什么效果:

mysql>插入学生(id、名称、class_id)值(7“stu7”6);

错误1452(23000):不能添加或更新一个孩子行:外键约束失败(“db_1”。“学生”,约束“cls_stu”外键(class_id)引用“类”(“id”))

无法添加这个记录,这说明了,学生表的class_id字段,已经受类表的id字段的约束,当类表的id字段没有这个id时,学生表无法插入这条记录。



7。删除一个表的外键约束。

ALTER TABLE学生删除外键【外键名称】

例:

ALTER TABLE学生删除外键cls_stu;


8. innodb引擎支持的一些关于外键的操作。

#当一个表被设置了外键约束,如果在父表中找不到候选键,则不允许在子表上进行插入/更新操作。

#,注意! ! !在父表上进行更新/删除以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决于:在定义子表的外键时指定的在更新或删除子句! ! !

#下面是innodb引擎所支持的常见的四种方式:


8.1级联方式在父表上更新/删除记录时,同步更新/删除掉子表的匹配记录

外键的级联删除:如果父表中的记录被删除,则子表中对应的记录自动被删除

ALTER TABLE学生添加约束cls_stu外键(class_id)引用类(id)级联删除;

#级联删除或更改,当父表外键位置做出修改,或者删除,子表更改或删除完全取决于上删除或更新者,当然,这两个关键字是可以同时出现的! ! !

下面是一个级联删除关键字的示例:

ALTER TABLE学生添加约束cls_stu外键(class_id)引用类(id)级联删除;


8.2空方式在父表上更新/删除记录时,将子表上匹配记录的列设为null。

例:

ALTER TABLE学生添加约束cls_stu外键(class_id)引用类(id)删除设置零;


8.3,限制方式:拒绝对父表进行删除更新操作(不常用)。


8.4任何行动方式在mysql中同限制,如果子表中有匹配的记录,则不允许对父表对应候选键进行更新/删除操作了(解)


9。关于外键的一些补充:

设置级联操作:

在主表数据发生改变时,与之关联的从表数据应该如何处理

,,使用关键字:

,,,在更新

,,,在删除

,,来标识

允许的级联动作:

级联关联操作,如果主表被更新或删除,从表也会执行相应的操作

设置为空,表示从表数据不指向主表任何记录

限制:拒绝主表的相关操作

alter table t_student添加外键(class_id)引用t_class (class_id)

删除设置零;#在删除外键时,将从表的外键值设置为空

修改外键:

先删除这个表的外键,然后再增加

alter table tb_name下降froeign关键外键名称

外键名称在建立外键时可以自定义名称,如果不自定义,会按照mysql自动生成一个名称

补12。关于mysql的外键约束