概念

表能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。插入相同主键的两条记录是不被允许的。

MySQL主键设计原则:不使用任何业务相关的字段作为主键

永远也不要更新MySQL主键,修改主键会造成一系列的影响。

MySQL主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等

主键设计的常用方案是自增ID。因为整数通常是主键的最好选择,因为它很快且可以使用AUTO_INCREAMENT,如果可能,应该避免使用字符串类型作为标识列,因为很消耗空间,且通常比数字类型慢。

MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。在创建索引的时候,可以指定在删除、更新父表时,对子表进行的相应操作,外键属性包括 RESTRICT, NO ACTION, SET NULL和CASCADE。默认是restrictRESTRICT 和 NO ACTION相同,是指在子表有关联记录的情况下父表不能更新

CASCADE表示父表在更新或者删除时,更新或者删除子表对应记录

SET NULL则是表示父表在更新或者删除的时候,子表的对应字段被SET NULL

外键最好在创建表时进行,对主键外键的各种操作最好都在Workbench里进行,因为命令实在太复杂。注意主外键的类型要匹配,否则会报错:

在创建表时创建外键,一般结尾是ON DELETE CASCADE ON UPDATE NO ACTION;,对DELETE命令按CASCADE处理,在父表中执行DELETE后会同步更新子表,如果是RESTRICT,还得先操作子表,这样C++程序会复杂很多;对UPDATE按默认的不更新处理。

查看主外键可以用show create table tabelName查看表 tabelName 的创建信息,包含了主外键,当然用Workbench更好

用命令查看数据库database1的所有键,它存在表INFORMATION_SCHEMA.KEY_COLUMN_USAGE里面1select TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where CONSTRAINT_SCHEMA ='database1'

实例

新建两个表point和map,前者做子表,后者做父表,因为有了地图才能有点。

map表的情况:

point表的情况:

外键关系涉及一个包含中心数据值的父表,以及一个具有相同值的子表,指向其父表。表point中的MapName有外键约束,指向了表map的主键MapName,如果后者的MapName不是主键,创建时会报错.

外键不一定是另一个表的主键,但必须是唯一性索引,主键约束和唯一性约束都是唯一性索引。若要确保验证了组合 FOREIGN KEY 约束的所有值,请将所有参与列指定为 NOT NULL

子表若要增加一行,其MapName必须是父表中已经有的MapName.反过来,父表若要删除一行,其MapName必须是子表中没有的,否则子表中的MapName无法生存.

如果直接删除父表中的一行,gf在子表中的MapName也存在,此时删除会报错:

所以规范做法是先删除子表中的gf行,再去父表中删除gf对应的行。

也可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况:1

2

3SET FOREIGN_KEY_CHECKS = 0;

SET FOREIGN_KEY_CHECKS = 1;

但是子表不会有变化,实际相当于不限制对父表和子表的操作顺序,最稳妥的方法还是先操作子表再操作父表.

如果一个表中的外键连到另一个表的主键,注意在Workbench中设置时,在一个外键中只设置自己对应得主键,不要连另一个也设置,也就是两个外键要分开,否则会报错

问题

在MySQL Workbench上使用”TRUNCATE TABLE;”清空一个表时返回错误: Error Code: 1701. Cannot truncate a table referenced in a foreign key constraint

解决方法:1

2

3SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE TABLE TABLE_E;

SET FOREIGN_KEY_CHECKS = 1;

mysql主键和外键的连接_MySQL的主键和外键相关推荐

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

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

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

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

  3. mysql 主外键_mysql中主外键关系

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

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

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

  5. mysql删除表外键_MySQL删除所有表的外键约束、禁用外键约束

    数据库的外键虽然能保证数据数据一致性和完整性,但是也一定程度地影响了数据更新的性能.在开发中,我们使用PowerDesigner建立物理数据模型时,为了结构的清晰,增加可读性,会创建表与表之间的关联关 ...

  6. mysql 给几个主键值 批量校验是否存在_MySQL基础知识整理

    MySQL基础架构 MySQL基础架构 简单来说MySQL主要分为Server层和存储引擎层.Server层主要包括连接器.查询缓存.分析器.优化器和执行器等,所有跨存储引擎的功能都在这一层实现,比如 ...

  7. SQLAlchemy的使用---外键ForeignKey数据库创建与连接

    SQLAlchemy的使用---外键ForeignKey数据库创建与连接 # 一对多建表操作 from sqlalchemy.ext.declarative import declarative_ba ...

  8. mysql外键约束脚本_使用SQL脚本创建数据库,操作主键、外键与各种约束(MS SQL Server)...

    在实际开发中,可能很少人会手写sql脚本来操作数据库的种种.特别是微软的MS SQL Server数据库,它的SQL Server Management Studio对数据库的图形化操作极致简便,从而 ...

  9. MySQL的索引(普通索引、唯一索引,主键索引、组合索引、全文索引、空间索引)相关操作

    目录 索引介绍 Hash索引和B+tree索引的区别 应用场景 索引分类 普通索引 创建单列索引--普通索引(3种语法) 查看数据库中的索引 查看数据表中的索引 删除索引 唯一索引 主键索引 组合索引 ...

  10. mysql insert 主键冲突_在MySql中建立存储过程和解决insert into select 中主键冲突的有关问题...

    首先说需求,我想重复插入大量数据,那么首先想到的,就是用insert into select语句. 但是因为mysql中没有将主键设为自增长,导致每次都会报主键冲突的错误,插入失败. 对于这个问题,就 ...

最新文章

  1. 面向对象(类的概念,属性,方法,属性的声明,面向对象编程思维
  2. 全球32家人工智能独角兽公司
  3. python3下载教程-《Python3从入门到放弃》视频教程
  4. 区块链BaaS云服务(24)秘猿科技CITA
  5. 最大期望算法与混合高斯模型的推导
  6. 地图定义一个中间不动标注_高精度地图制作(三)
  7. C++map容器-插入和删除
  8. 阶分差数 matlab,matlab中aicbic确定阶数的太小
  9. spring+hibernate+mysql mvc 配置
  10. class action extends mysql{_java Action 请求封装(二)
  11. 什么是技术档案(Technical Archives)?
  12. matlab用Java绘图_Java中使用MATLAB作图
  13. 花式讲解校园网绕过认证原理
  14. Vue File Manager – PHP即时存储、共享和获取文件基于VUE v2.2.0.2
  15. Words Reciting 2016.5.4
  16. led的伏安特性曲线 matlab实现_灯泡伏安特性仿真实验的实现算法
  17. 【※主题下载の命零电脑桌面主题※】
  18. 一种Δ-Σ模数转换器中梳状滤波器的设计
  19. PTA基础编程题目集7-33 有理数加法
  20. 张正友相机标定(全流程,含畸变,matlab源代码解析)

热门文章

  1. 面试总结——Java篇
  2. bzoj 4832 [Lydsy1704月赛]抵制克苏恩 期望dp
  3. pem文件转cer文件
  4. BZOJ 1191 超级英雄 Hero 题解
  5. 使用ASP.NET WEB API构建基于REST风格的服务实战系列教程(一)——使用EF6构建数据库及模型...
  6. [Java]一则自定义的XStream转换器,主要用于POJO XML反序列化为Map/List
  7. 神经网络的归一化(batch normalization)
  8. php遍历多个数据,php 数据遍历
  9. QEMU/KVM libvirt X710 PCI passthrough DPDK 网络性能测试
  10. mfc 子窗体任何消息都不触发_你不知道的 WebSocket