一、什么是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自动生成一个名称