MySQL外键&外键约束
程序员文章站
2022-05-31 23:34:18
...
今天给大家分享一下关于MySQL外键的知识内容
如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。外键主要用来保证数据的完整性和一致性
- 外键
使用条件:
- 表的存储引擎必须为innodb,myisam目前没有支持外键
- 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;
- 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;
外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;
- 外键约束
先直接上效果
建表
CREATE TABLE `dage` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(32) default '',
PRIMARY KEY (`id`))
ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `xiaodi` (
`id` int(11) NOT NULL auto_increment,
`dage_id` int(11) default NULL,
`name` varchar(32) default '',
PRIMARY KEY (`id`),
KEY `dage_id` (`dage_id`),
CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
插入个大哥(插入实验数据):
MariaDB [workone]> insert into dage(name) values('铜锣湾');
Query OK, 1 row affected, 1 warning (0.360 sec)
MariaDB [workone]> select * from dage;
+----+--------+
| id | name |
+----+--------+
| 1 | 铜锣湾 |
+----+--------+
1 row in set (0.001 sec)
插入个小弟:
MariaDB [workone]> insert into xiaodi(dage_id,name) values(1,'铜锣湾_小弟A');
Query OK, 1 row affected (0.334 sec)
MariaDB [workone]> select * from xiaodi;
+----+---------+--------------+
| id | dage_id | name |
+----+---------+--------------+
| 1 | 1 | 铜锣湾_小弟A |
+----+---------+--------------+
1 row in set (0.001 sec)
把大哥删除:
mysql> delete from dage where id=1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`bstar/xiaodi`, CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`))
提示:不行呀,有约束的,大哥下面还有小弟,可不能扔下我们不管呀!
插入一个新的小弟:
mysql> insert into xiaodi(dage_id,name) values(2,'旺角_小弟A');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`bstar/xiaodi`, CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`))
提示:小子,想*呀!你还没大哥呢!
外键约束有多种,分别是
- CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行
- SET NULL: 从父表删除或更新行,并设置子表中的外键列为NULL
- NO ACTION: 在ANSI SQL-92标准中,NO ACTION意味这不采取动作,就是如果有一个相关的外键值在被参考的表里,删除或更新主要键值的企图不被允许进行(Gruber, 掌握SQL, 2000:181)。 InnoDB拒绝对父表的删除或更新操作。
- RESTRICT: 拒绝对父表的删除或更新操作。NO ACTION和RESTRICT都一样
- SET DEFAULT: 这个动作被解析程序识别,但InnoDB拒绝包含ON DELETE SET DEFAULT或ON UPDATE SET DEFAULT子句的表定义。
转载至:https://www.cnblogs.com/programmer-tlh/p/5782451.html
上一篇: MySQL学习笔记——连接
下一篇: 探讨如何实现PHP数组排序