我正在cleardb
中将php
用于mysql数据库。情况是这样的:
我在beneficiary
表中添加记录。在添加之后,我正在获取last_inserted _id
。并使用此id
在beneficiary_payment_info
中添加付款方式。在大多数情况下,它都能正常工作。但是,有时我在错误日志中找到以下消息:
违反完整性约束:1452无法添加或更新子行:外键约束失败(cdb_85c337008c
。beneficiary_payment_info
,CONSTRAINT beneficiary_payment_info_ibfk_1
外国密钥(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');
最佳答案
问题中给出的信息不足,无法准确诊断问题。
如果auto_increment_increment
设置为10
的值,并且值6061
,6071
,6081
是自动生成的,则6073
值似乎不是自动生成的值。last_insert_id
函数返回自动生成的值。它不会返回明确分配给列的值。
(我们确实注意到可以更改auto_increment_increment
的值。但是,将auto_increment_increment
从值10
更改为值2
,然后更改为8
似乎很奇怪。 10
的值,然后又改回last_insert_id
的值。这根本不能解释观察到的6073
行为。)
复写
并且此讨论完全忽略了涉及复制的可能性,即last_insert_id
值可能是由其他服务器生成的。显然,ClearDB支持“多主”复制。
参考:https://www.cleardb.com/developers/help/faq#general_16
事务是否有可能在两个不同的MySQL服务器上“拆分”?
https://www.cleardb.com/developers/help/faq#general_10
使用函数有很多警告。必须从同一会话中调用该函数,紧接着成功生成INSERT(或UPDATE)并生成AUTO_INCREMENT值yada,yada,yada之后。
参考:https://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id
关于php - MySQL:违反完整性约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30079800/