Mysql:完整性约束违规

时间:2015-05-06 14:33:45

标签: php mysql cleardb

我在cleardb中使用php用于mysql数据库。情况是这样的:

我在beneficiary表中添加记录。并在添加之后我正在获取last_inserted _id。并使用此idbeneficiary_payment_info中添加付款方式。它在大多数情况下都能正常工作。但是,有时我在错误日志中找到以下消息:

  

完整性约束违规:1452无法添加或更新子行:外键约束失败(cdb_85c337008cbeneficiary_payment_info,CONSTRAINT beneficiary_payment_info_ibfk_1 FOREIGN KEY(ben_id)参考beneficiaryid))'

当我在数据库中检查时,我得到了这个截图:

TABLE: beneficiary

TABLE: beneficiary_payment_info

正如您所看到的,第一个表中有一个id 6073,但它不在第二个表中。我因此而犯了错误。并且在第一个表中有2个相同的记录(6073和6081),因为用户已经第二次请求该页面。

我该如何解决这个问题?请指导我。感谢。

编辑(clearDB的回复)

解决此问题的最佳方法是停止涉及auto_increment值。

您可以使用子查询,而不是尝试猜测或设置它们,类似于以下样式:

INSERT INTO CHILDREN (ParentID, FirstName, LastName)
VALUES ((SELECT ID FROM PARENTS WHERE FirstName = 'John' AND LastName = 'Doe'),
'Jane', 'Doe');

1 个答案:

答案 0 :(得分:1)

问题中没有足够的信息来准确诊断问题。

如果auto_increment_increment设置为值10,值 6061 6071 ,自动生成 6081 ...然后看起来值 6073 是自动生成的值。

last_insert_id 函数返回自动生成的值;它 not 返回一个明确分配给列的值。

(我们注意到可以更改auto_increment_increment的值。但是auto_increment_increment10的值更改为a 2似乎很奇怪8的值,然后更改为10的值,然后更改回last_insert_id的值。这并不能解释观察到的{{1}的行为}}。)

<强>复制

此讨论完全忽略了涉及复制的可能性,6073值可能是由不同的服务器生成的。显然,ClearDB支持&#34;多主机&#34;复制。

参考:https://www.cleardb.com/developers/help/faq#general_16

交易是否可能得到&#34;拆分&#34;跨两个不同的MySQL服务器?

https://www.cleardb.com/developers/help/faq#general_10

使用last_insert_id功能有很多警告。必须在成功 INSERT(或UPDATE)之后立即从同一会话调用,生成AUTO_INCREMENT值,yada,yada,yada。

参考:https://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id