外键是关联不同表之间的一个联接,比如我们现在有两张表:


那么如何设置外键呢?

mysql> create table class(classId int primary key auto_increment,className varchar(20));
Query OK, 0 rows affected (0.02 sec)mysql> create table student(studentId int primary key auto_increment,name varchar(20),classId int,-> foreign key (classId) references class(classId));
Query OK, 0 rows affected (0.04 sec)mysql> desc student;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| studentId | int         | NO   | PRI | NULL    | auto_increment |
| name      | varchar(20) | YES  |     | NULL    |                |
| classId   | int         | YES  | MUL | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)mysql> desc class;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| classId   | int         | NO   | PRI | NULL    | auto_increment |
| className | varchar(20) | YES  |     | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)


另外需要注意的是,外键关联的必须是另一个表的主键(非空且唯一的键)。
如果一个表中的主键被关联了,那这个表的主键不能被修改/删除:

mysql> update class set classId = 10 where className = '一班';
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`z1`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`classId`) REFERENCES `class` (`classId`))
mysql> update student set classId = 10 where name = 'z1';
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`z1`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`classId`) REFERENCES `class` (`classId`))

为什么不能被修该/删除呢,因为这样就会出现矛盾。所以这样的操作被mysql禁止了。
外键的约束,有时候也不是个好用的东西,因为当两张表分别为订单和商品的时候,可能会过于约束,导致商品不能下架。
那么我们怎么解决这种过度的约束呢?
我们可以给商品表加一列,【是否有效】,这样,已经下单的订单,就算关联了商品,我们也可以通过【是否有效】这一栏,来判断商品是否下架。

【MYSQL】foreign key 外键约束(详解)相关推荐

  1. MySQL数据库约束(主键约束,外键约束详解)

    关系型数据库的一个重要功能: 需要保证数据的"完整性",可以通过人工的方式来观察确认数据的正确性,这种方式是可行的,但是不合适,因为人为控制的方式势必会存在疏忽,导致一些错误没有被 ...

  2. 外键约束详解及术语释疑

    外键约束详解及术语释疑 先要理清几个概念: 1)候选键(Candidate Key):关系中的一个属性组,其值能唯一标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质了,这样的属性组称作 ...

  3. 零基础带你学习MySQL—foreign key 外键(二十六)

    零基础带你学习MySQL-foreign key 外键(二十六) -- 外键演示 -- 创建 主表 my_class CREATE TABLE my_class ( id INT PRIMARY KE ...

  4. mysql数据库约束详解_MySQL数据库中的外键约束详解

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

  5. mysql外键约束详解_详解MySQL 外键约束

    详解MySQL 外键约束,西欧,西西里,玛雅,兵种,诺曼 详解MySQL 外键约束 易采站长站,站长之家为您整理了详解MySQL 外键约束的相关内容. 官方文档: https://dev.mysql. ...

  6. mysql外键约束案例_SQLServer FOREIGN KEY外键约束讲解及使用实例

    FOREIGN KEY约束添加规则 1.外键约束并不仅仅可以与另一表的主键约束相链接,它还可以定义为引用另一个表中 UNIQUE 约束的列. 2.如果在 FOREIGN KEY 约束的列中输入非 NU ...

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

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

  8. mysql一对一外键约束_MySQL数据库之-foreign key 外键(一对多、多对多、一对一)、修改表、复制表...

    我们在同一数据库创建的表时候,很多时候会出现相同数据的冗余问题,也就是说几个id会有一个或者同n个相同字段,这样就导致数据表结构数据重复冗余, 冗余还无所谓,关键是如果我要改其中一个相同的字段信息,其 ...

  9. mysql 命令行 外键_MySQL命令行MySql外键设置详解

    第一招.mysql服务的启动和停止 net stop mysql net start mysql 第二招.登陆mysql 语法如下: mysql -u用户名 -p用户密码 键入命令mysql -uro ...

最新文章

  1. 关于consistent hash的思考及改进方案
  2. html用户登录界面开源代码_Toolkit Pro助力企业开专业且强大的图形用户界面,抢占市场先机...
  3. http://snmp.adventnet.com/help/snmpapi/snmpv3/table_handling/snmptables_rowdata.html
  4. ICCV 2015 《Understanding and Diagnosing Visual Tracking Systems》论文笔记
  5. 可执行文件添加快捷方式_如何停止Windows向快捷方式文件名添加“-快捷方式”...
  6. 页面体验提升小技巧—渐进式图片
  7. ipv6地址格式_IPV6与IPV4的差异
  8. 【转载】RocketMQ优秀文章
  9. designer pyqt5 界面切换_PyQt5快速上手基础篇3-设置窗口标题和图标
  10. Dataset XML 序列化,什么是序列化
  11. 2021年POS机费率上调了吗?
  12. Lucene.Net的中文分词组件AdvancedChineseAnalyzer
  13. Tensorflow的可视化框架:TensorBoard
  14. Multisim安装问题
  15. Tomcat服务器端口修改,tomcat服务器配置端口 tomcat端口号修改操作步骤
  16. 安卓加载asset中的json文件_Android Studio读取本地json(读取assets中的文件)
  17. as_completed和wait源码分析
  18. 解决双启动GRLDR missing故障的方法
  19. Yolov5如何在训练意外中断后接续训练
  20. P3387 【模板】缩点 Tarjan强连通分量/树上dp

热门文章

  1. java白盒测试代码_Java白盒测试
  2. vs2017开发ActiveX(主讲OCX)(七)、方法
  3. ks 曲线_ROC、KS曲线及AUC、KS值
  4. GPS授时是什么意思
  5. 工业dcs系统有服务器吗,DCS是什么 你了解多少
  6. 双轴反作用轮定点自平衡杆动力学模型
  7. 液晶显示模块(LCM)介绍
  8. R语言-频数统计函数
  9. 安全帽佩戴检测算法研究
  10. 全连接神经网络(FCNN)