在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两个表,大哥表是主键,小弟表是外键:

建表:

1

CREATE TABLE `dage` (

2

  `id` int(11) NOT NULL auto_increment,

3

  `name` varchar(32) default '',

4

  PRIMARY KEY  (`id`)

5

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

6

7

CREATE TABLE `xiaodi` (

8

  `id` int(11) NOT NULL auto_increment,

9

  `dage_id` int(11) default NULL,

10

  `name` varchar(32) default '',

11

  PRIMARY KEY  (`id`),

12

  KEY `dage_id` (`dage_id`),

13

  CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)

14

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

插入个大哥:

1

mysql> insert into dage(name) values('铜锣湾');

2

Query OK, 1 row affected (0.01 sec)

3

mysql> select * from dage;

4

+----+--------+

5

| id | name   |

6

+----+--------+

7

|  1 | 铜锣湾 |

8

+----+--------+

9

1 row in set (0.00 sec)

插入个小弟:

1

mysql> insert into xiaodi(dage_id,name) values(1,'铜锣湾_小弟A');

2

Query OK, 1 row affected (0.02 sec)

3

4

mysql> select * from xiaodi;

5

+----+---------+--------------+

6

| id | dage_id | name         |

7

+----+---------+--------------+

8

|  1 |       1 | 铜锣湾_小弟A |

9

+----+---------+--------------+

把大哥删除:

1

mysql> delete from dage where id=1;

2

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`))

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

插入一个新的小弟:

1

mysql> insert into xiaodi(dage_id,name) values(2,'旺角_小弟A');

2

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`))

3

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

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

1

mysql> show create table xiaodi;

2

3

  CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)

4

5

mysql> alter table xiaodi drop foreign key xiaodi_ibfk_1;

6

Query OK, 1 row affected (0.04 sec)

7

Records: 1  Duplicates: 0  Warnings:

8

mysql> alter table xiaodi add foreign key(dage_id) references dage(id) on delete cascade on update cascade;

9

Query OK, 1 row affected (0.04 sec)

10

Records: 1  Duplicates: 0  Warnings: 0

再次试着把大哥删了:

1

mysql> delete from dage where id=1;

2

Query OK, 1 row affected (0.01 sec)

3

4

mysql> select * from dage;

5

Empty set (0.01 sec)

6

7

mysql> select * from xiaodi;

8

Empty set (0.00 sec)

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

例子说明的应该蛮清楚了吧,其他功能对应手册自己实践吧!:-)

mysql foreign key_MYSQL外键(Foreign Key)的使用相关推荐

  1. mysql set foreign key_Mysql 外键(FOREIGN KEY)使用注意事项

    外键,FOREIGN KEY, 这个东东,作为DBA,在Oracle我们都不建议在数据库级别去实现约束,因为他的维护成本很高, 比如你要保证索引,导入数据时你得保证先后顺序等,所以我们更推荐由应用去控 ...

  2. Java数据库foreign,mysql中的外键foreign key 作者:Java_xb

    一张表中可以有多个外键. 外键的默认作用有两点: 1.对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段在父表中找不到对应的匹配,操作就会失败. 2.对父表的作用:对父表的主键字段进行 ...

  3. 【MySQL】解决MySQL删除外键(foreign key)时报错问题

    [MySQL]解决MySQL删除外键(foreign key)时报错问题 文章目录 [MySQL]解决MySQL删除外键(foreign key)时报错问题 一.现象 二.分析 三.问题解决 四.拓展 ...

  4. 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)

    1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...

  5. MySQL数据库(25):外键 foreing key

    外键 foreing key 外键表示了两个实体之间的联系 外键 foreing key: A表中的一个字段的值指向另B表的主键 B: 主表 A: 从表 主表:主键(主关键字) = 从表:外键(外关键 ...

  6. mysql 约束条件 外键 forigen key 介绍

    外键 forigen key作用 :建立表之间的关系 什么是外键 员工信息表有这些字段:id号  姓名 性别 员工所在部门名 部门描述信息 公司有3个部门,但是有1个亿的员工,那意味着 员工所对应的部 ...

  7. mysql不能删除外键吗,MySQL不能删除外键约束所需的索引

    MySQL不能删除外键约束所需的索引 我需要改变现有的数据库添加一列. 因此我也想更新UNIQUE字段来包含这个新列. 我试图删除当前的索引,但不断收到错误MySQL Cannot drop inde ...

  8. mysql外键约束案例_详解MySQL中的外键约束问题

    使用MySQL开发过数据库驱动的小型web应用程序的人都知道,对关系数据库的表进行创建.检索.更新和删除等操作都是些比较简单的过程 .理论上,只要掌握了最常见的SQL语句的用法,并熟悉您选择使用的服务 ...

  9. mysql级联删除外键约束_mysql通过外键级联删除

    mysql 可通过外键约束,实现数据的级联更新或者删除. 例如有主表(员工排班表): CREATE TABLE `personal_schedule` ( `id` int(11) NOT NULL  ...

最新文章

  1. 论流量平台(交易内容)生死劫——币看流量生意正在进入正循环
  2. 安全研究人员发现:Nanocore等多个远控木马滥用公有云服务传播
  3. 他因为泼了李彦宏一瓶水,成功圈粉无数,成为「网红」
  4. ios消息推送机制原理与实现(转)
  5. 《计量经济学》学习笔记之放宽基本假定的模型
  6. 数字化技术浪潮下,医院临床科研如何「华丽变身」
  7. JS Number对象常用函数(数字类型常用函数)
  8. 网络监控工具 开源_在不到一个月的时间内,我如何使用开源工具成为网络漫画家
  9. 【Docker】Docker 一个偶现的错误 bash命令突然找不到
  10. mysql 2003 10038_关于MySql10038错误的完美解决方法(三种)
  11. Myeclipse7.X和8.X汉化
  12. 林期苏曼属性标签编辑_标签打印软件如何打印指定日期
  13. 文本文档如何运行c语言代码,C程序员如何创建、打开、关闭文本文件或二进制文件...
  14. VScode环境变量配置
  15. failover机制
  16. TOTP 介绍及基于C#的简单实现
  17. 十分钟手把手教你设计简单易用的组件级考试题(单选、多选、填空、图片),建议收藏
  18. Vim 编辑器及其基本操作
  19. eclipse下maven调试的技巧(Re-run Maven using the -X switch to enable full debug logging.)
  20. ssh远程连接发送命令行

热门文章

  1. apollo修改配置刷新bean_携程开源的分布式apollo技术整合springboot集成实现动态刷新配置
  2. 中概股暴跌后的大厂员工:230万缩水至23万、和家人一起“开源节流”
  3. “忘恩负义”的浪胃仙,是个真狠人!
  4. 小米超大杯旗舰不叫12 Ultra:或命名为MIX 5 Pro
  5. 探秘亚洲最大单体智慧农园:探索改变农民“靠天吃饭”的农作模式
  6. 还要做手机?罗永浩称还完债就重返科技行业
  7. 华为:预计6G将于2030年左右投向市场
  8. 华为关联公司哈勃投资晟芯网络 持股10%
  9. OPPO关联公司被授权“脑电波采集方法”相关专利
  10. 市场观察人士:有充足代工产能支持 联发科3月份营收有望创下新高