MySQL主键和外键使用及说明

一、外键约束

MySQL通过外键约束来保证表与表之间的数据的完整性和准确性。

外键的使用条件:

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

建表:

1CREATE 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

7CREATE 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;

插入个大哥:

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

2Query OK, 1 row affected (0.01 sec)

3mysql> select * from dage;

4+----+--------+

5| id | name |

6+----+--------+

7| 1 | 铜锣湾 |

8+----+--------+

91 row in set (0.00 sec)

插入个小弟:

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

2Query OK, 1 row affected (0.02 sec)

3

4mysql> select * from xiaodi;

5+----+---------+--------------+

6| id | dage_id | name |

7+----+---------+--------------+

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

9+----+---------+--------------+

把大哥删除:

1mysql> delete from dage where id=1;

2ERROR 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> insert into xiaodi(dage_id,name) values(2,'旺角_小弟A');

2ERROR 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

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

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

1mysql> show create table xiaodi;

2

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

4

5mysql> alter table xiaodi drop foreign key xiaodi_ibfk_1;

6Query OK, 1 row affected (0.04 sec)

7Records: 1 Duplicates: 0 Warnings:

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

9Query OK, 1 row affected (0.04 sec)

10Records: 1 Duplicates: 0 Warnings: 0

再次试着把大哥删了:

1mysql> delete from dage where id=1;

2Query OK, 1 row affected (0.01 sec)

3

4mysql> select * from dage;

5Empty set (0.01 sec)

6

7mysql> select * from xiaodi;

8Empty set (0.00 sec)

哎呦,这回对应的小弟也没了,没办法,谁让你跟我on delete cascade(级联限制)了呢!

mysql主键和外键的连接_MySQL主键和外键使用及说明相关推荐

  1. mysql索引类型和区别是什么意思_mysql主键索引和普通索引之间的区别是什么

    索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.MySQL提供多种索引类型供选择:普通索引 .唯一性索引.主键索引 .全文索引等等.下面本篇文章就来给大家介绍一下主键索 ...

  2. mysql command为sleep时项目可以连接_Mysql中Sleep进程连接数过多问题解决

    解决方法 批量删除 sleep 进程状态的连接数. 1).一种直接在MySQL命令控制台操作: mysql> show processlist; mysql> SELECT concat( ...

  3. mysql command为sleep时项目可以连接_mysql数据库常连接造成大量sleep状态怎么办

    设置max_execution_time 来阻止太长的读SQL.那可能存在的问题是会把所有长SQL都给KILL 掉.有些必须要执行很长时间的也会被误杀. 自己写个脚本检测这类语句,比如order by ...

  4. mysql怎么写主外键_mysql主外键约束怎么写?

    mysql主键约束的写法:"CREATE TABLE 表名(字段名 数据类型 PRIMARY KEY)":mysql外键约束的写法:"CREATE TABLE 表名(FO ...

  5. MySQL 之 约束 (主键、唯一、非空、自增、外键)

    MySQL 之 约束 (主键.唯一.非空.自增.外键) 目的:使得数据更准确,更完整. 约束的分类: 1.键约束 (1)主键约束 (2)唯一键约束 (3)外键约束 2.非空约束 3.默认值约束 4.自 ...

  6. mysql存在外键的连接_MySQL(外连接、自然连接、新增-追加-删除外键、外键条件-约束)...

    外连接(outer join) left join:左外连接(左连接),以左表为主表 right join:右外连接(右连接),以右表为主表 基本语法:左表 left/right join 右表 on ...

  7. mysql主键能当外键吗_MySQL主键跟外键

    定义主键和外键主要是为了维护关系数据库的完整性,总结一下:1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄. 身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号 ...

  8. mysql多表连接 索引_MySQL多表查询之外键、表连接、子查询、索引

    一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, ...

  9. 主码索引、聚集索引、非主码索引(辅助索引)、唯一索引、外键索引、复合索引、非主码索引、聚集主码(聚集索引)、单列索引、多列索引、普通索引等...

    强烈建议看了第一个参考文献再来看这个篇博文,因为此处不准备讲底层数据结构的实现. 索引:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构.其 ...

  10. mysql建表时外检怎么创建_MySQL创建表时加入的约束以及外键约束的的意义

    1,创建表时加入的约束 a) 非空约束,not null b) 唯一约束,unique c) 主键约束,primary key d) 外键约束,foreign key 1,非空约束,针对某个字段设置其 ...

最新文章

  1. HLG 1539 选课
  2. cocos creator 获取当前时间_前端开发者入门 Creator 必读吧
  3. 【Android Gradle 插件】ProductFlavor 配置 ( applicationId 配置 | SdkVersion 相关配置 | version 应用版本配置 )
  4. 【Python】分享14条非常实用的Pandas函数方法,建议珍藏!!
  5. 扎心!程序员泪奔的8个瞬间
  6. java人种_实在看不出藏族有大量矮黑血统
  7. 作者:黎建辉(1973-),男,博士,中国科学院计算机网络信息中心研究员、博士生导师。...
  8. 中台不火,天理难容!
  9. python多线程实现for循环_Python多线程实现同时执行两个while循环
  10. Linux进程间通信——使用消息队列
  11. 自动驾驶软件开发人才现状_浅析自动驾驶的重要一环:感知系统发展现状与方向...
  12. [TJOI2015]弦论(后缀数组or后缀自动机)
  13. python中关于图例legend在图外的画法简析
  14. steam怎么设公用计算机,steam怎样设置家庭共享 steam家庭共享设置办法
  15. 大学生计算机专业顶岗实习日记24篇
  16. 做到这五点,才算是好用户体验 -- 转自周鸿祎在UPA用户体验大会上的演讲
  17. Win10系统异常应该怎么修复
  18. oracle数据库查询,sql没问题,数据库也有数据,方法没错,项目运行就是查不出数据
  19. ASP.NET(C#)对接国际验证码接口DEMO示例
  20. 使用Webcam实现拍照功能

热门文章

  1. 聊聊 Tomcat 的单机多实例
  2. 【jQuery】jQ处理xml文件和xml字符串
  3. 现代语音信号处理之语音特征参数估计
  4. 深度学习之Bottleneck Layer or Bottleneck Features
  5. 树莓派——使用SDK定期备份本地文件到OSS(自用)
  6. qt制作一个简易的听小说工具
  7. 天锋w2019_三星看了想打人,华强北神机天锋W2019现世,专卖店都难辨真假
  8. rds基于什么开发_玩物得志: 基于DataWorks+MaxCompute+MC-Hologres 构建大数据平台
  9. #pragma push_macro(new) 及扩展操作
  10. Android飞机大战小游戏