阅读目录 前言一、外键作用及其限制条件1 外键的定义2 外键的作用3 外键创建限制 二、外键创建方法1 创建外键的语法2 举例(1)创建两张表(2)创建外键(3)查看表结构 三、验证外键作用1 先向主表中添加数据
在Mysql中,我们都对主键比较了解,知道主键的主要作用是唯一区分表中的各个行;
但是,对于外键(foreign key) 比较陌生。
外键是某个表中的一列,它包含在另一个表的主键中。
外键也是索引的一种,是通过一张表中的一列指向另一张表中的主键,来对两张表进行关联。
一张表可以有一个外键,也可以存在多个外键,与多张表进行关联。
外键的主要作用是保证数据的一致性和完整性,并且减少数据冗余。
主要体现在以下两个方面:
阻止执行
级联执行
父表必须已经存在于数据库中,或者是当前正在创建的表。
如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
必须为父表定义主键。
外键中列的数目必须和父表的主键中列的数目相同。
两个表必须是 InnoDB 表,MyISAM 表暂时不支持外键。
外键列必须建立了索引,mysql 4.1.2 以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立。
外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如 int 和tinyint 可以,而 int 和 char 则不可以;
可以在创建表时创建外键,也可以在已有的表中增加外键。
我们主要讲第二种方式创建外键。
ALTER TABLE 表名 ADD CONSTRaiNT 外键名 FOREIGN KEY(外键字段名)REFERENCES 外表表名(主键字段名)[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTioN | SET DEFAULT}][ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}] 其中,ON DELETE 和 ON UPDATE 表示事件触发限制,各参数意义如下:
| 参数 | 意义 |
|---|---|
| RESTRICT | 限制外表中的外键改动(默认值,也是最安全的设置) |
| CASCADE | 跟随外键改动 |
| SET NULL | 设为null值 |
| NO ACTION | 无动作 |
| SET DEFAULT | 设为默认值 |
CREATE TABLE student(id int (11) primary key auto_increment,name char(255),sex char(255),age int(11))charset utf8; CREATE TABLE student_score(id int (11) primary key auto_increment,class char(255),score char(255),student_id int(11))charset utf8; ALTER TABLE student_score ADD CONSTRAINT s_id FOREIGN KEY (student_id) REFERENCES student (id); SHOW CREATE TABLE student;SHOW CREATE TABLE student_score; CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` char(255) DEFAULT NULL, `sex` char(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; CREATE TABLE `student_score` ( `id` int(11) NOT NULL AUTO_INCREMENT, `class` char(255) DEFAULT NULL, `score` char(255) DEFAULT NULL, `student_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `s_id` (`student_id`), CONSTRAINT `s_id` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; 再向从表中添加数据(从表中的外键已在主表中存在),正常运行。
#向 student 表中添加数据INSERT INTO student (NAME, sex, age)VALUES('小明', '男', '20');#向 student_score 表中添加数据INSERT INTO student_score (class, score, student_id)VALUES('语文', '100', 1),('数学', '99', 1),('英语', '98', 1); 数据插入正常,无报错、警告信息。


INSERT INTO student_score (class, score, student_id)VALUES('语文', '100', 2); ERROR 1452 (23000) : Cannot ADDOR UPDATE a child ROW : a FOREIGN KEY CONSTRAINT fails (`tts`.`student_score`,CONSTRAINT `s_id` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`)) UPDATE student_scoreSET student_id = 2WHEREstudent_id = 1; ERROR 1452 (23000) : Cannot ADDOR UPDATE a child ROW : a FOREIGN KEY CONSTRAINT fails (`tts`.`student_score`,CONSTRAINT `s_id` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`)) DELETE FROM student WHERE id = 1; ERROR 1451 (23000) : Cannot DELETEOR UPDATE a parent ROW : a FOREIGN KEY CONSTRAINT fails (`tts`.`student_score`,CONSTRAINT `s_id` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`)) UPDATE student SET id = 2 WHERE id = 1; ERROR 1451 (23000) : Cannot DELETEOR UPDATE a parent ROW : a FOREIGN KEY CONSTRAINT fails (`tts`.`student_score`,CONSTRAINT `s_id` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`)) #删除旧的外键ALTER TABLE student_score DROP FOREIGN KEY s_id; #添加新的外键,修改事件触发限制为 CASCADEALTER TABLE student_score ADD CONSTRAINT s_id FOREIGN KEY (student_id) REFERENCES student (id) ON DELETE CASCADE ON UPDATE CASCADE; CREATE TABLE `student_score` ( `id` int(11) NOT NULL AUTO_INCREMENT, `class` char(255) DEFAULT NULL, `score` char(255) DEFAULT NULL, `student_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `s_id` (`student_id`), CONSTRAINT `s_id` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; 
UPDATE student SET id = 2 WHERE id = 1; 
DELETE FROM student WHERE id = 2; 
事件触发限制条件的不同,会造成两张表中的操作限制不同,其他几个限制条件相对好理解,大家可以自己进行尝试,体会其中的区别。
ALTER TABLE 表名 DROP FOREIGN KEY 外键名; ALTER TABLE student_score DROP FOREIGN KEY s_id; 来源地址:https://blog.csdn.net/weiguang102/article/details/126409406
--结束END--
本文标题: MySQL中的外键(foreign key)
本文链接: https://www.lsjlt.com/news/380035.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0