目录

文章目录

  • 目录
  • MySQL 的外键约束
  • 创建表时定义外键(References,参照)
  • 修改原有表的外键约束
  • 删除外键约束
  • 参考文档

MySQL 的外键约束

注意,MySQL 的 InnoDB 表引擎才支持外键关联,MyISAM 不支持。MySQL 还支持手动打开或关闭外键约束:SET FOREIGN_KEY_CHECKS = 0/1;

使用外键约束最大的好处在于 MySQL 会帮助我们完成数据的一致性检查。当我们使用默认的外键类型 RESTRICT 时,在创建、修改或者删除记录时都会检查引用的合法性。

假设我们的数据库中包含 posts(id, author_id, content)authors(id, name) 两张表,在执行如下所示的操作时都会触发数据库对外键的检查:

  • 向 posts 表中插入数据时,检查 author_id 是否在 authors 表中存在;
  • 修改 posts 表中的数据时,检查 author_id 是否在 authors 表中存在;
  • 删除 authors 表中的数据时,检查 posts 中是否存在引用当前记录的外键;

作为专门用于管理数据的系统,数据库与应用服务相比能够更好地保证完整性,而上述的这些操作都是引入外键带来的额外工作,不过这也是数据库保证数据完整性的必要代价。上述的这些分析都是理论上的定性分析,我们其实可以简单的定量分析一下引入外键对性能的影响。

创建表时定义外键(References,参照)

在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键,具体的语法格式如下:

[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…] REFERENCES <主表名> 主键列1 [,主键列2,…]

示例:

# 部门表 tb_dept1(主表)
CREATE TABLE tb_dept1
(id INT(11) PRIMARY KEY,name VARCHAR(22) NOT NULL,location VARCHAR(50)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;# 员工表 tb_emp6(从表),创建外键约束,让 deptId 作为外键关联到 tb_dept1 的主键 id。
CREATE TABLE tb_emp6
(id INT(11) PRIMARY KEY,name VARCHAR(25),deptId INT(11),salary FLOAT,CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

NOTE:从表的外键关联的必须是主表的主键,且主键和外键的数据类型必须一致。

以上语句执行成功之后,在表 tb_emp6 上添加了名称为 fk_emp_dept1 的外键约束,外键名称为 deptId,其依赖于表 tb_dept1 的主键 id。

查看主表的约束信息:

MariaDB [test_db]> select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where REFERENCED_TABLE_NAME='tb_dept1'\G;
*************************** 1. row ***************************CONSTRAINT_CATALOG: defCONSTRAINT_SCHEMA: test_dbCONSTRAINT_NAME: fk_emp_dept1TABLE_CATALOG: defTABLE_SCHEMA: test_dbTABLE_NAME: tb_emp6COLUMN_NAME: deptIdORDINAL_POSITION: 1
POSITION_IN_UNIQUE_CONSTRAINT: 1REFERENCED_TABLE_SCHEMA: test_dbREFERENCED_TABLE_NAME: tb_dept1REFERENCED_COLUMN_NAME: id
1 row in set (0.00 sec)

修改原有表的外键约束

外键约束也可以在修改表时添加,但是添加外键约束的前提是:从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。

在修改数据表时添加外键约束的语法格式如下:

ALTER TABLE <数据表名> ADD CONSTRAINT <外键名> FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);

示例:修改数据表 tb_emp2,将字段 deptId 设置为外键,与数据表 tb_dept1 的主键 id 进行关联。

# 创建 tb_emp2(从表)
CREATE TABLE tb_emp2
(id INT(11) PRIMARY KEY,name VARCHAR(25),deptId INT(11),salary FLOAT
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;MariaDB [test_db]> desc tb_emp2;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+# 添加外键约束
ALTER TABLE tb_emp2 ADD CONSTRAINT fk_tb_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id);MariaDB [test_db]> desc tb_emp2;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  | MUL | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+MariaDB [test_db]> SHOW CREATE TABLE tb_emp2\G
*************************** 1. row ***************************Table: tb_emp2
Create Table: CREATE TABLE `tb_emp2` (`id` int(11) NOT NULL,`name` varchar(25) DEFAULT NULL,`deptId` int(11) DEFAULT NULL,`salary` float DEFAULT NULL,PRIMARY KEY (`id`),KEY `fk_tb_dept1` (`deptId`),CONSTRAINT `fk_tb_dept1` FOREIGN KEY (`deptId`) REFERENCES `tb_dept1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312

删除外键约束

当一个表中不需要外键约束时,就需要从表中将其删除。外键一旦删除,就会解除主表和从表间的关联关系。

删除外键约束的语法格式如下所示:

ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;

示例:删除数据表 tb_emp2 中的外键约束 fk_tb_dept1。

ALTER TABLE tb_emp2 DROP FOREIGN KEY fk_tb_dept1;MariaDB [test_db]> SHOW CREATE TABLE tb_emp2\G
*************************** 1. row ***************************Table: tb_emp2
Create Table: CREATE TABLE `tb_emp2` (`id` int(11) NOT NULL,`name` varchar(25) DEFAULT NULL,`deptId` int(11) DEFAULT NULL,`salary` float DEFAULT NULL,PRIMARY KEY (`id`),KEY `fk_tb_dept1` (`deptId`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312

参考文档

http://c.biancheng.net/view/2441.html

MySQL — 外键关联操作相关推荐

  1. MySQL外键关联(一对多)MySQL连接查询

    MySQL外键关联(一对多) 外键说明 什么是外键? 1)表A中有字段(如身份证号)做了主键,表B中也有这个字段(身份证号),这里的身份证号一定来自表A同样字段里的内容,但再B表中身份证号对应id可以 ...

  2. mysql 外键关联

    mysql 外键关联 什么是外键: 外键是一个特殊的索引,用于关联两个表,只能是指定内容. 如我将新建一个daka的表,然后将此表的class_id 与另外一个class的表的cid字段关联 clas ...

  3. PostgreSQL — 外键关联操作

    目录 文章目录 目录 PostgreSQL 的外键关联 创建表时定义外键(References,参照) 修改原有表的外键约束 删除外键约束 参考文档 PostgreSQL 的外键关联 一个外键约束指定 ...

  4. mysql外键(FK)及其外键关联操作reference

    mysql中外键的应用条件: 1.只有InnoDB可以使用外键, 2.在引用表中,必须有一个索引 使用语法:在创建表时写入 foreign key (外键名) reference 关联的表名 (关联的 ...

  5. mysql外键关联查询_MySQL外键约束和多表联查

    一.创建外键 #测试数据表 # 教师表,主表 CREATE TABLE teacher( id INT PRIMARY KEY AUTO_INCREMENT, name varchar(20), ag ...

  6. mysql外键级联操作_Mysql 外键级联

    如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常 ...

  7. mysql 外键关联_mysql外键关联

    主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表 ...

  8. 外键 级联操作 mysql

    外键 级联操作 mysql 级联就是联动的操作 如果主表中 级联更新 效果,请表ID变化,从表关联的数据也发生变化 级联更新 如果主表中的数据删除 从表中与它相关联的数据也删除 演练代码 -- 级联更 ...

  9. MySQL权限篇之REFERENCES以及外键级联操作

    REFERENCES,对象权限. 建立外键关系权限. 用户要在tb1上建立外键,外键指向tb2,那么该用户必须在tb2上有REFERENCES权限. 当然,还要有在tb1上alter的权限. 比如: ...

最新文章

  1. C#:将另一个应用程序的主窗口移至屏幕最前
  2. c# 解析JSON的几种办法(转载)
  3. C#中自定义类数组和结构数组的使用
  4. 在控制台显示sql语句,类似hibernate show_sql.
  5. (教学思路 c#之类一)声明类和对象、定义类成员及其引用
  6. java xmlrpc2.0 实现_简单的java xmlrpc
  7. intel服务器修复两个漏洞,英特尔处理器漏洞怎么修复 Intelcpu漏洞修复方法
  8. 如何把测试库的统计信息导入到生产库
  9. 我的世界服务器怎么注册密码1.9,我的世界1.9.x /1.10服务器BEST CRAFT(最佳工艺服务器)...
  10. java获取鼠标点击的坐标_怎么我用Java窗外获取鼠标点击的坐标
  11. Linux内核中的atoi,itoa等函数
  12. 数字电路基础知识—— IO外设之GPIO介绍
  13. macbookwps excel颜色填充快捷键_Excel VBA 实例(31) 为VBA代码自定义快捷键
  14. nmos导通流向_MOS管知识大集
  15. !!!python 100行代码编写【Google 图片搜索爬取工具】多线程
  16. 我在云栖社区读硕士,大数据专业
  17. 常用C++库及测试程序
  18. Aspose.Words 复制表格并将复制的表格插入原有表格后面
  19. #2微信小程序错误:音乐API调用音乐URL时出现错误
  20. 从零开始构建一个高可靠的RabbitMQ镜像集群

热门文章

  1. iOS10 UI教程基础窗口的内容与设置起始窗口
  2. 面试pythonweb开发的简历_【经验分享】对于Python各个方向的面试经验分享,非常给力!...
  3. 简单的java单位换算_单位换算示例代码
  4. 脑电实验注意事项及实验过程中伪迹识别
  5. 纹身电极: 一种新型的可以进行脑信号测量的电极
  6. 恶意软件伪装成系统更新,通杀Win Mac Linux三大系统,隐藏半年才被发现
  7. 小猫咪小狗狗也有智能「手表」了,可监测健康,识别情绪,还防乱跑|CES 2022...
  8. 李开复张亚勤巅峰对话,还有虚拟人自动驾驶论坛,今年MEET智能未来大会,我蚌埠住了...
  9. 三星最新屏幕黑科技:可拉伸的OLED屏,能贴在皮肤上
  10. 波士顿动力机器狗打工这一年