`
jiangshuiy
  • 浏览: 339235 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MySQL中外键约束

阅读更多
外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;

如果在父表中找不到候选键,则不允许在子表上进行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中外键约束的参照动作(Referential Action)

    本文参考资料为MySQL官方参考手册MySQL 8.0 Reference Manual条目13.1.20.6 FOREIGN KEY Constraints (吐槽一句,这个referential action我真不知道应该翻译成什么,网络上好像也没有统一的叫法,教材上它直接不配...

    mysql级联更新和级联删除

    #### 二、MySQL中外键约束的支持 MySQL的InnoDB存储引擎自版本3.23.44起支持外键约束。需要注意的是,在较早版本的MySQL中(如MyISAM),不支持外键约束。 #### 三、创建外键约束 外键约束可以在创建表时或者通过...

    Java面试题-Mysql中级面试题

    #### 十四、MySQL中外键约束的创建 - **创建方法**: 使用 `FOREIGN KEY` 关键字。 - **作用**: 确保两个表之间的一致性和完整性,防止删除或修改引用表中的数据时引发的问题。 #### 十五、触发器的定义与用途 - *...

    mysql内外键使用

    总结来说,MySQL中外键的作用是: 1. 确保数据的一致性和完整性,防止非法数据的插入。 2. 在表格之间建立关联,使得数据操作能够跨越多个表格。 3. 支持级联操作,简化数据更新和删除的复杂性。 正确理解和使用...

    mysql性能优化综述

    ### MySQL性能优化综述 MySQL作为一款广泛使用的开源关系型数据库管理系统,在许多应用场景中都需要针对其性能进行优化。本文将从几个关键方面详细介绍如何优化MySQL的性能。 #### 1. 最底层优化 - **参数优化**:...

    禁用启用所有外键约束.tst

    这行命令会关闭对当前会话中外键检查的支持,允许插入可能违反外键约束的数据。 2. **启用外键约束**: 当完成需要的操作后,要重新启用外键约束,使用: ```sql SET FOREIGN_KEY_CHECKS = 1; ``` 这将恢复...

    mysql的外键

    在本详细讲解中,我们将深入探讨MySQL中外键的概念、创建、使用以及相关的操作。 1. **外键概念** - 外键是用于链接两个表的字段,它引用了另一个表的主键,确保了数据的参照完整性和一致性。 - 引用表(父表)是...

    mysql外键的使用

    本文将详细讲解MySQL中外键的使用及其重要性。 首先,理解外键的定义:外键(Foreign Key)是一个字段,它的值来源于另一个表的主键。这个机制使得一个表(称为子表或从表)可以引用另一个表(称为父表或主表)的...

    解决django框架model中外键不落实到数据库问题

    然而,在某些情况下,我们可能希望在Django Model中使用外键,但并不希望这个外键在数据库层面实际创建约束。 当在Django的Model中定义外键时,默认情况下,Django会自动在数据库中创建相应的外键约束。但是,如果...

    mysql数据库设置外键应该注意的几点

    MySQL的MyISAM存储引擎不支持外键约束,因此在设置外键时,需要确保使用支持外键的存储引擎,如InnoDB。 8. **外键约束检查时机**: 默认情况下,MySQL在`DEFERRED`模式下,只在事务提交时检查外键约束。若需在...

    最新最经典最全面的MySQL资料,绝版下载进行中……4

    这一特性主要通过**外键(Foreign Key)**机制来实现,本文将基于提供的部分内容,深入探讨MySQL中外键与参照完整性的应用,以及如何通过外键在不同表间建立关联,确保数据的合法性与连贯性。 #### 参照完整性的意义...

    mysql外键基本功能与用法详解

    总结来说,MySQL中外键的主要功能在于维护数据库中的引用完整性和一致性,通过约束模式实现数据间的联动操作。正确使用外键能够提高数据的逻辑严密性,防止数据错误,同时也有利于数据的管理和查询。

    MySql外键设置详解

    1. CASCADE:外键表中外键字段值会被更新,或者所在的列会被删除。 2. RESTRICT:RESTRICT 也相当于 no action, 即不进行任何操作。即,不允许父表 update 外键关联列,delete 记录。 3. SET NULL:被父面的外键...

    MySQL外键使用及说明详解

    本文将深入探讨MySQL中外键的使用、条件、好处以及定义语法。 首先,外键约束是实现数据库关系完整性的一种方式,它允许一个表(子表)引用另一个表(父表)的主键。为了使用外键,有以下几个关键条件: 1. 表引擎...

    深入mysql外键关联问题的详解

    本文通过深入分析MySQL中外键关联问题,旨在帮助读者理解并掌握外键的创建、修改以及删除等操作的详细知识点。 首先,了解外键的定义是非常必要的。在关系型数据库中,外键(Foreign Key)是表中一个字段或一组字段...

Global site tag (gtag.js) - Google Analytics