标签:价值 创建 上网 插入 pes 关联 时报 size int
在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类型,子表关联键的类型可以是父表主键的超集,当然最好是完全一样。
随笔结尾时,忍不住想吐槽一下:
标签:价值 创建 上网 插入 pes 关联 时报 size int
原文地址:https://www.cnblogs.com/wggj/p/9023540.html