mysql foreign key_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两个表,大哥表是主键,小弟表是外键:
建表:
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)的使用相关推荐
- mysql set foreign key_Mysql 外键(FOREIGN KEY)使用注意事项
外键,FOREIGN KEY, 这个东东,作为DBA,在Oracle我们都不建议在数据库级别去实现约束,因为他的维护成本很高, 比如你要保证索引,导入数据时你得保证先后顺序等,所以我们更推荐由应用去控 ...
- Java数据库foreign,mysql中的外键foreign key 作者:Java_xb
一张表中可以有多个外键. 外键的默认作用有两点: 1.对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段在父表中找不到对应的匹配,操作就会失败. 2.对父表的作用:对父表的主键字段进行 ...
- 【MySQL】解决MySQL删除外键(foreign key)时报错问题
[MySQL]解决MySQL删除外键(foreign key)时报错问题 文章目录 [MySQL]解决MySQL删除外键(foreign key)时报错问题 一.现象 二.分析 三.问题解决 四.拓展 ...
- 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)
1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...
- MySQL数据库(25):外键 foreing key
外键 foreing key 外键表示了两个实体之间的联系 外键 foreing key: A表中的一个字段的值指向另B表的主键 B: 主表 A: 从表 主表:主键(主关键字) = 从表:外键(外关键 ...
- mysql 约束条件 外键 forigen key 介绍
外键 forigen key作用 :建立表之间的关系 什么是外键 员工信息表有这些字段:id号 姓名 性别 员工所在部门名 部门描述信息 公司有3个部门,但是有1个亿的员工,那意味着 员工所对应的部 ...
- mysql不能删除外键吗,MySQL不能删除外键约束所需的索引
MySQL不能删除外键约束所需的索引 我需要改变现有的数据库添加一列. 因此我也想更新UNIQUE字段来包含这个新列. 我试图删除当前的索引,但不断收到错误MySQL Cannot drop inde ...
- mysql外键约束案例_详解MySQL中的外键约束问题
使用MySQL开发过数据库驱动的小型web应用程序的人都知道,对关系数据库的表进行创建.检索.更新和删除等操作都是些比较简单的过程 .理论上,只要掌握了最常见的SQL语句的用法,并熟悉您选择使用的服务 ...
- mysql级联删除外键约束_mysql通过外键级联删除
mysql 可通过外键约束,实现数据的级联更新或者删除. 例如有主表(员工排班表): CREATE TABLE `personal_schedule` ( `id` int(11) NOT NULL ...
最新文章
- 论流量平台(交易内容)生死劫——币看流量生意正在进入正循环
- 安全研究人员发现:Nanocore等多个远控木马滥用公有云服务传播
- 他因为泼了李彦宏一瓶水,成功圈粉无数,成为「网红」
- ios消息推送机制原理与实现(转)
- 《计量经济学》学习笔记之放宽基本假定的模型
- 数字化技术浪潮下,医院临床科研如何「华丽变身」
- JS Number对象常用函数(数字类型常用函数)
- 网络监控工具 开源_在不到一个月的时间内,我如何使用开源工具成为网络漫画家
- 【Docker】Docker 一个偶现的错误 bash命令突然找不到
- mysql 2003 10038_关于MySql10038错误的完美解决方法(三种)
- Myeclipse7.X和8.X汉化
- 林期苏曼属性标签编辑_标签打印软件如何打印指定日期
- 文本文档如何运行c语言代码,C程序员如何创建、打开、关闭文本文件或二进制文件...
- VScode环境变量配置
- failover机制
- TOTP 介绍及基于C#的简单实现
- 十分钟手把手教你设计简单易用的组件级考试题(单选、多选、填空、图片),建议收藏
- Vim 编辑器及其基本操作
- eclipse下maven调试的技巧(Re-run Maven using the -X switch to enable full debug logging.)
- ssh远程连接发送命令行
热门文章
- apollo修改配置刷新bean_携程开源的分布式apollo技术整合springboot集成实现动态刷新配置
- 中概股暴跌后的大厂员工:230万缩水至23万、和家人一起“开源节流”
- “忘恩负义”的浪胃仙,是个真狠人!
- 小米超大杯旗舰不叫12 Ultra:或命名为MIX 5 Pro
- 探秘亚洲最大单体智慧农园:探索改变农民“靠天吃饭”的农作模式
- 还要做手机?罗永浩称还完债就重返科技行业
- 华为:预计6G将于2030年左右投向市场
- 华为关联公司哈勃投资晟芯网络 持股10%
- OPPO关联公司被授权“脑电波采集方法”相关专利
- 市场观察人士:有充足代工产能支持 联发科3月份营收有望创下新高