我在cleardb
中使用php
用于mysql数据库。情况是这样的:
我在beneficiary
表中添加记录。并在添加之后我正在获取last_inserted _id
。并使用此id
在beneficiary_payment_info
中添加付款方式。它在大多数情况下都能正常工作。但是,有时我在错误日志中找到以下消息:
完整性约束违规:1452无法添加或更新子行:外键约束失败(
cdb_85c337008c
。beneficiary_payment_info
,CONSTRAINTbeneficiary_payment_info_ibfk_1
FOREIGN KEY(ben_id
)参考beneficiary
(id
))'
当我在数据库中检查时,我得到了这个截图:
正如您所看到的,第一个表中有一个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');
答案 0 :(得分:1)
问题中没有足够的信息来准确诊断问题。
如果auto_increment_increment
设置为值10
,值 6061
, 6071
,自动生成 6081
...然后看起来值 6073
不是自动生成的值。
last_insert_id
函数返回自动生成的值;它 not 返回一个明确分配给列的值。
(我们注意到可以更改auto_increment_increment
的值。但是auto_increment_increment
从10
的值更改为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