一、问题描述

在oracle, postgresql正常运行的Hibenate/JPA应用程序,切换到mysql时却在插入数据时报错:“MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails……”。

检查应用程序代码,没发现不对;网上直接搜索,也没发现有价值的线索。

回到mysql,先删掉报错时的外键,再次启动应用程序,插入数据成功。然后再想加上外键时,同样的错误提示出现了。看来问题不在应用程序,而在mysql这边。

锁定范围后再上网搜索,原因很快确定:是因为子表的关联键是decimal(15),而父表的主键却是decimal(17)。父表主键的范围超出了子表键的范围。

把子表关联键的类型改为decimal(17),加外键成功;再执行应用程序的插入数据功能,一切OK!

二、进一步测试

再去翻阅mysql官方文档,发现对外键有这样的限制条件:

Corresponding columns in the foreign key and the referenced key must have similar data types. The size and sign of integer types must be the same. The length of string types need not be the same. For nonbinary (character) string columns, the character set and collation must be the same.

这里面只提到integer, string,没有提到decimal类型,于是做了个测试。将本例中子表关联键的长度改为decimal(18),发现也正常。说明对于decimal类型,子表关联键的类型可以是父表主键的超集,当然最好是完全一样。

另外,要修改已建好外键的子表关联键的类型,必须:

先删掉外键:alter table table_name drop foreign key constraint_name;

再修改关联键类型:alter table table_name modify column_name ...;

最后增加外键:alter table table_name add constraint foreign key (column_name) references parent_table_name(pk_name) on ...;

Mysql不允许直接修改已有外键关联的相关字段的定义。

三、吐槽

随笔结尾时,忍不住想吐槽一下:

oracle, postgresql对这种情况都是容忍的,为什么mysql不容忍?

不容忍就不容忍吧,为什么不在创建空子表的外键时就报错(至少来个警告吧),而非要等到运行时才出来?

最后吐槽一下官方文档,如果不是恰巧遇到,估计一辈子都不知道decimal类型的外键有这种限制。

mysql decimal 上限_关于mysql的decimal类型的外键的一个特殊限制相关推荐

  1. MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结

    MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结 一.VARCHAR存储和行长度限制 1.VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是 ...

  2. mysql语句命令_常用MySQL语句(命令行)

    # 命令行客户端MySQLMySQL是一个关系型数据库管理系统 安装MySQL服务端软件使用: sudo apt-get install mysql-server 安装MySQL客户端软件使用: su ...

  3. mysql优化经验_中国移动MySQL数据库优化经验

    开源数据库MySQL比较容易碰到性能瓶颈,为此经常需要对MySQL数据库进行优 化,而MySQL数据库优化需要运维DBA与相关开发共同参与,其中MySQL参数及服务器配置优化主要由运维DBA完成,开发 ...

  4. mysql核心数据库_从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程...

    从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程 课程目录 (1) 01MySQL基础_课程引入.avi (2) 02MySQL基础_为什么学习 ...

  5. mysql多大_洞悉MySQL底层架构:游走在缓冲与磁盘之间

    提起MySQL,其实网上已经有一大把教程了,为什么我还要写这篇文章呢,大概是因为网上很多网站都是比较零散,而且描述不够直观,不能系统对MySQL相关知识有一个系统的学习,导致不能形成知识体系.为此我撰 ...

  6. mysql emoji表情_让MySQL支持Emoji表情 mysql 5.6

    最近在做微信相关的项目,其中MySQL 要存储emoji表情,因此发现我们常用的utf8 字符集根本无法存储表情.网上有不少替代方案.本人还是采用了修改MySQL字符集的方案简单快捷. 首先将我们数据 ...

  7. php mysql emoji表情_让MySQL支持Emoji表情

    让MySQL支持Emoji表情,涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集.utf8mb4和utf8到底有什么区别呢?原来以往的 让MySQL支持Emoji表情,涉及无线 ...

  8. 加速mysql导入时间_加快mysql导入导出速度

    MySQL导出的SQL语句在处理百万级数据的时候,可能导入要花几小时.在导出时合理使用几个参数,可以大大加快导入的速度. -e 使用包括几个VALUES列表的多行INSERT语法; --max_all ...

  9. mysql解析运行时间_分析 MySQL 语句运行时间

    为了验证select 1 与 select 1 from tableName 与 select * from tableName的执行效率,需要测试一下各自执行的时间.于是总结一下,查看mysql语句 ...

最新文章

  1. php(wamp安装问题)
  2. 单自由度阻尼强迫振动通解求导及simulink验证(修正了网上常见的错误)
  3. Android Studio导入project和module的方法
  4. 90后程序员健康现状:掉头发、油腻、腰椎间盘突出……
  5. eclipse新建服务器项目,使用eclipse快速新建spirngboot项目的方法
  6. Python collections 模块中的 deque(队列)
  7. 190510每日一句
  8. 【记录】前端代码规范 规范
  9. MATLAB和C语言的区别
  10. et200s模块接线图讲解_ET200S 模块说明
  11. JS中常见的兼容写法
  12. Jersey是一个什么框架,价值在哪里?
  13. 不上网电脑安装python_离线安装python第三方库的实用方法:解决公司内网,服务器/电脑不能上网却需要安装python三方库问题(上:Windows环境中)...
  14. MediaRecorder MPEG4Writer
  15. php自学难_php难吗?自学要多久?需要报培训班吗?
  16. Dell服务器如何做raid
  17. 微信小程序之顶部导航栏(选项卡)实例 —— 微信小程序实战系列(1)
  18. elementui 表格的简单封装
  19. postgresql java驱动_PostgreSQL的JDBC驱动和URL
  20. 熊海CMS 1.0代码审计漏洞集合

热门文章

  1. 数据库下午怎么插入_数据库性能调优大全(附某大型医院真实案例)
  2. 【李宏毅2020 ML/DL】P77 Generative Adversarial Network | Theory behind GAN
  3. 《强化学习》中的第10章:基于函数逼近的同轨策略控制
  4. 更名OpenShift容器平台,红帽实现战略性转变
  5. 约瑟夫问题(猴子选大王)
  6. VS2010 代码自动对齐 快捷键
  7. 让nginx支持php
  8. delphi开发回忆录——面向对象的基础,继承
  9. testng执行参数_初识TestNG测试框架
  10. java类型转换 float类型转换_Java类型转换 – float(和long)到int