外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;
如果在父表中找不到候选键,则不允许在子表上进行insert/update
外键定义服从下列情况:
· 所有tables必须是InnoDB型,它们不能是临时表。
· 在引用表中,必须有一个索引,外键列以同样的顺序被列在其中作为第一列。这样一个索引如果不存在,它必须在引用表里被自动创建。
· 在引用表中,必须有一个索引,被引用的列以同样的顺序被列在其中作为第一列。
· 不支持对外键列的索引前缀。这样的后果之一是BLOB和TEXT列不被包括在一个外键中,这是因为对这些列的索引必须总是包含一个前缀长度。
· 如果CONSTRAINTsymbol被给出,它在数据库里必须是唯一的。如果它没有被给出,InnoDB自动创建这个名字。
外键的定义语法:
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字。
ON DELETE、ON UPDATE表示事件触发限制,可设参数:
RESTRICT(限制外表中的外键改动)
CASCADE(在父表上update/delete记录时,同步update/delete掉子表的匹配记录)
SET NULL(在父表上update/delete记录时,将子表上匹配记录的列设为null
要注意子表的外键列不能为not null )
SET DEFAULT(设默认值)
NO ACTION(无动作,默认的,如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作)
注意:trigger不会受外键cascade行为的影响,即不会解发trigger
参考例子:
简单演示一下使用,做dage和xiaodi两个表,大哥表是主键,小弟表是外键:
建表:
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
插入个大哥:
mysql> insert into dage(name) values('铜锣湾');
Query OK, 1 row affected (0.01 sec)
mysql> select * from dage;
+----+--------+
| id | name |
+----+--------+
| 1 | 铜锣湾 |
+----+--------+
1 row in set (0.00 sec)
插入个小弟:
mysql> insert into xiaodi(dage_id,name) values(1,'铜锣湾_小弟A');
Query OK, 1 row affected (0.02 sec)
mysql> select * from xiaodi;
+----+---------+--------------+
| id | dage_id | name |
+----+---------+--------------+
| 1 | 1 | 铜锣湾_小弟A |
+----+---------+--------------+
把大哥删除:
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`))
提示:小子,想造反呀!你还没大哥呢!
把外键约束增加事件触发限制:
mysql> show create table xiaodi;
CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)
mysql> alter table xiaodi drop foreign key xiaodi_ibfk_1;
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings:
mysql> alter table xiaodi add foreign key(dage_id) references dage(id) on delete cascade on update cascade;
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0
再次试着把大哥删了:
mysql> delete from dage where id=1;
Query OK, 1 row affected (0.01 sec)
mysql> select * from dage;
Empty set (0.01 sec)
mysql> select * from xiaodi;
Empty set (0.00 sec)
得,这回对应的小弟也没了,没办法,谁让你跟我on delete cascade了呢!
例子参考:http://www.cppblog.com/wolf/articles/69089.html
分享到:
相关推荐
本文参考资料为MySQL官方参考手册MySQL 8.0 Reference Manual条目13.1.20.6 FOREIGN KEY Constraints (吐槽一句,这个referential action我真不知道应该翻译成什么,网络上好像也没有统一的叫法,教材上它直接不配...
#### 二、MySQL中外键约束的支持 MySQL的InnoDB存储引擎自版本3.23.44起支持外键约束。需要注意的是,在较早版本的MySQL中(如MyISAM),不支持外键约束。 #### 三、创建外键约束 外键约束可以在创建表时或者通过...
#### 十四、MySQL中外键约束的创建 - **创建方法**: 使用 `FOREIGN KEY` 关键字。 - **作用**: 确保两个表之间的一致性和完整性,防止删除或修改引用表中的数据时引发的问题。 #### 十五、触发器的定义与用途 - *...
总结来说,MySQL中外键的作用是: 1. 确保数据的一致性和完整性,防止非法数据的插入。 2. 在表格之间建立关联,使得数据操作能够跨越多个表格。 3. 支持级联操作,简化数据更新和删除的复杂性。 正确理解和使用...
### MySQL性能优化综述 MySQL作为一款广泛使用的开源关系型数据库管理系统,在许多应用场景中都需要针对其性能进行优化。本文将从几个关键方面详细介绍如何优化MySQL的性能。 #### 1. 最底层优化 - **参数优化**:...
这行命令会关闭对当前会话中外键检查的支持,允许插入可能违反外键约束的数据。 2. **启用外键约束**: 当完成需要的操作后,要重新启用外键约束,使用: ```sql SET FOREIGN_KEY_CHECKS = 1; ``` 这将恢复...
在本详细讲解中,我们将深入探讨MySQL中外键的概念、创建、使用以及相关的操作。 1. **外键概念** - 外键是用于链接两个表的字段,它引用了另一个表的主键,确保了数据的参照完整性和一致性。 - 引用表(父表)是...
本文将详细讲解MySQL中外键的使用及其重要性。 首先,理解外键的定义:外键(Foreign Key)是一个字段,它的值来源于另一个表的主键。这个机制使得一个表(称为子表或从表)可以引用另一个表(称为父表或主表)的...
然而,在某些情况下,我们可能希望在Django Model中使用外键,但并不希望这个外键在数据库层面实际创建约束。 当在Django的Model中定义外键时,默认情况下,Django会自动在数据库中创建相应的外键约束。但是,如果...
MySQL的MyISAM存储引擎不支持外键约束,因此在设置外键时,需要确保使用支持外键的存储引擎,如InnoDB。 8. **外键约束检查时机**: 默认情况下,MySQL在`DEFERRED`模式下,只在事务提交时检查外键约束。若需在...
这一特性主要通过**外键(Foreign Key)**机制来实现,本文将基于提供的部分内容,深入探讨MySQL中外键与参照完整性的应用,以及如何通过外键在不同表间建立关联,确保数据的合法性与连贯性。 #### 参照完整性的意义...
总结来说,MySQL中外键的主要功能在于维护数据库中的引用完整性和一致性,通过约束模式实现数据间的联动操作。正确使用外键能够提高数据的逻辑严密性,防止数据错误,同时也有利于数据的管理和查询。
1. CASCADE:外键表中外键字段值会被更新,或者所在的列会被删除。 2. RESTRICT:RESTRICT 也相当于 no action, 即不进行任何操作。即,不允许父表 update 外键关联列,delete 记录。 3. SET NULL:被父面的外键...
本文将深入探讨MySQL中外键的使用、条件、好处以及定义语法。 首先,外键约束是实现数据库关系完整性的一种方式,它允许一个表(子表)引用另一个表(父表)的主键。为了使用外键,有以下几个关键条件: 1. 表引擎...
本文通过深入分析MySQL中外键关联问题,旨在帮助读者理解并掌握外键的创建、修改以及删除等操作的详细知识点。 首先,了解外键的定义是非常必要的。在关系型数据库中,外键(Foreign Key)是表中一个字段或一组字段...