`
wusuoya
  • 浏览: 631617 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

MYSQL外键(Foreign Key)的使用

阅读更多

在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束。

外键作用:

保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!

外键的使用条件:
1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);
2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立; 
3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

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

外键的定义语法:
[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(跟随外键改动)
SET NULL(设空值)
SET DEFAULT(设默认值)
NO ACTION(无动作,默认的)

搞个例子,简单演示一下使用,做dage和xiaodi两个表,大哥表是主键,小弟表是外键:
建表:

 1MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定CREATE TABLE `dage` (
 2MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定  `id` int(11NOT NULL auto_increment,
 3MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定  `name` varchar(32default '',
 4MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定  PRIMARY KEY  (`id`)
 5MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 6MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定
 7MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定CREATE TABLE `xiaodi` (
 8MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定  `id` int(11NOT NULL auto_increment,
 9MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定  `dage_id` int(11default NULL,
10MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定  `name` varchar(32default '',
11MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定  PRIMARY KEY  (`id`),
12MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定  KEY `dage_id` (`dage_id`),
13MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定  CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)
14MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定) ENGINE=InnoDB DEFAULT CHARSET=latin1;

插入个大哥:
1MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定mysql> insert into dage(name) values('铜锣湾');
2MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定Query OK, 1 row affected (0.01 sec)
3MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定mysql> select * from dage;
4MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定+----+--------+
5MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定| id | name   |
6MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定+----+--------+
7MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定|  1 | 铜锣湾 |
8MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定+----+--------+
9MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定1 row in set (0.00 sec)

插入个小弟:
1MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定mysql> insert into xiaodi(dage_id,name) values(1,'铜锣湾_小弟A');
2MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定Query OK, 1 row affected (0.02 sec)
3MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定
4MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定mysql> select * from xiaodi;
5MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定+----+---------+--------------+
6MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定| id | dage_id | name         |
7MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定+----+---------+--------------+
8MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定|  1 |       1 | 铜锣湾_小弟A |
9MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定+----+---------+--------------+

把大哥删除:
1MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定mysql> delete from dage where id=1;
2MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定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`))


提示:不行呀,有约束的,大哥下面还有小弟,可不能扔下我们不管呀!

插入一个新的小弟:

1MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定mysql> insert into xiaodi(dage_id,name) values(2,'旺角_小弟A');              
2MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定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`))
3MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定


提示:小子,想造反呀!你还没大哥呢!

把外键约束增加事件触发限制:

 1MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定mysql> show create table xiaodi;
 2MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定
 3MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定  CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)
 4MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定
 5MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定mysql> alter table xiaodi drop foreign key xiaodi_ibfk_1; 
 6MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定Query OK, 1 row affected (0.04 sec)
 7MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定Records: 1  Duplicates: 0  Warnings: 
 8MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定mysql> alter table xiaodi add foreign key(dage_id) references dage(id) on delete cascade on update cascade;
 9MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定Query OK, 1 row affected (0.04 sec)
10MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定Records: 1  Duplicates: 0  Warnings: 0

再次试着把大哥删了:
1MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定mysql> delete from dage where id=1;
2MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定Query OK, 1 row affected (0.01 sec)
3MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定
4MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定mysql> select * from dage;
5MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定Empty set (0.01 sec)
6MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定
7MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定mysql> select * from xiaodi;
8MYSQL外键(Foreign Key)的使用(Cannot delete or update a parent row: a foreign key constraint fails ) - Tekghong Chong - 韩国记 记住与自己的约定Empty set (0.00 sec)



得,这回对应的小弟也没了,没办法,谁让你跟我on delete cascade了呢!

分享到:
评论

相关推荐

    mysql外键设置

    mysql外键的设置,使用。添加外键的格式: ALTER TABLE yourtablename ADD [CONSTRAINT 外键名] FOREIGN KEY [id] (index_col_name, ...) REFERENCES tbl_name (index_col_name, ...) [ON DELETE {CASCADE | ...

    mysql外键(Foreign Key)介绍和创建外键的方法

    主要介绍了mysql外键(Foreign Key)命令和添加外键方法,需要的朋友可以参考下

    外键约束(FOREIGN KEY)

    外键约束(FOREIGN KEY)

    MySQL添加外键时报错:1215 Cannot add the foreign key constraint的解决方法

    这篇文章主要涉及到在数据创建表时,遇到ERROR 1215 (HY000): Cannot add foreign key constraint 问题方面的内容,对于在数据创建表时,遇到同样问题感兴趣的同学可以参考一下。 一、问题的提出 创建两个表:  ...

    MySQL外键使用详解

    两天有人问mysql中如何加外键,今天抽时间总结一下。mysql中MyISAM和InnoDB存储引擎都支持外键(foreign key),但是MyISAM只能支持语法,却不能实际使用。

    MySQL删除表的时候忽略外键约束的简单实现

    ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails 这是因为你尝试删除的表中的字段被用作了其他表的外键,因此在删除这个表(父表)之前必须先删除具有外键的表(子表)...

    mysql外键的设置方法

    mysql数据库中外键的使用方法,这在数据库的设计中使用很频繁,很实用,适合初学者学习,当来的

    MySql建表语句的外键约束分离工具(FOREIGN KEY)

    在MySql数据库建表时,如果CREATE TABLE语句中添加了FOREIGN KEY,那么所依赖的表必须先被创建,痛苦不堪,使用我这个工具可以将外键约束的语句分离出来,单独执行。 具体说明可以参考帖子 ...

    MySQL外键创建失败1005原因汇总

    1、安装mysql有InnoDB的插件扩展 ./configure –prefix=/usr/local/mysql –with-plugins=csv,innobase,myisam,heap,innodb_plugin 2、找不到主表中 引用的列 3、主键和... 您可能感兴趣的文章:mysql外键(Foreign Key)

    mysql建立外键

    指定主键关键字: foreign key(列名) 引用外键关键字: references <外键表名>(外键列名) 事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set...

    mysql外键的三种关系实例详解

    本文实例讲述了mysql外键的三种关系。分享给大家供大家参考,具体如下: 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 一对多或多对一 多对一 create table press( id int ...

    mysql添加外键的四种方式

    mysql添加外键的四种方式:文章经过本人的测试,以图文并茂的方式详细描述了mysql数据库添加外键的...包含直接使用FOREIGN KEY方式、使用CONSTRAINT方式、使用ALTER语句方式、使用第三方工具方式。详情请查看文档内容。

    python-mysql day05.txt

    constraint 外键名 foreign key(字段) references 主表(字段) on delete 级联动作 on update 级联动作 3、级联动作 1、cascade :删除、更新同步(被参考字段) 2、restrict :不让主表更新、删除 3、set null...

    MySQL删除有外键约束的表数据方法介绍

    aforeignkeyconstraintfails (...) 这是因为MySQL中设置了foreign key关联,造成无法更新或删除数据。可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况。 禁用外键约束,我们可以使用: SETFOREIGN_KEY_CHECKS=...

    (mysql面试题)MySQL中的索引、主键和外键的概念及其作用及代码展示.txt

    3. 外键(Foreign Key): 外键是数据库表中用于与其他表建立关联的列或一组列。外键的值必须是被引用表的主键值,或者为空。通过外键,可以实现表与表之间的关联,例如,一个订单表和一个客户表可以通过外键关联,...

    MySQL删除外键问题小结

    MySQL:MySQL不能删除外键,抱错Error ...mysql> ALTER TABLE ruler.test2child DROP FOREIGN KEY test; ERROR 1025 : Error on rename of ''./ruler/test2child'' to ''./ruler/#sql2-298-8f'' (errno: 152) 这里并不是

    解析在MySQL里创建外键时ERROR 1005的解决办法

    在MySQL里创建外键时,提示错误,但只提示很简单的信息:ERROR 1005 (HY000): Can’t create table ...在信息中有一组【LATEST FOREIGN KEY ERROR】会有最近错误的详细描述和解决办法。如:111211 12:49:34 Error in f

    mysql数据库设计(1).pdf

    创建表之后,添加外键 ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称); 4. 级联操作 1. 添加级联操作 语法:ALTER TABLE 表名 ADD CONSTRAINT 外键名称 ...

Global site tag (gtag.js) - Google Analytics