欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL外键&外键约束

程序员文章站 2022-05-31 23:34:18
...

今天给大家分享一下关于MySQL外键的知识内容

   如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。外键主要用来保证数据的完整性和一致性
  • 外键

       使用条件:

  1. 表的存储引擎必须为innodb,myisam目前没有支持外键
  2. 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立; 
  3. 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如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