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

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


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


当我检查数据库时,得到以下屏幕截图:





如您所见,第一个表中有一个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的值,并且值606160716081是自动生成的,则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/

10-12 06:25