0

我正在使用cleardbmysql 数据库php。情况是这样的:

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

完整性约束违规:1452 无法添加或更新子行:外键约束失败 ( cdb_85c337008c. beneficiary_payment_info, CONSTRAINT beneficiary_payment_info_ibfk_1FOREIGN KEY ( ben_id) REFERENCES 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');
4

1 回答 1

1

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

如果auto_increment_increment设置为 的值10,并且值60616071、是自动生成的……那么6081看起来该值6073不是自动生成的值。

last_insert_id函数返回自动生成的值;它不返回显式分配给列的值。

(我们确实注意到,可以更改 的值auto_increment_increment。但是,auto_increment_increment从 的值更改为 的102,然后更改为 的值8,然后再更改回 的值,这似乎很奇怪10。这根本不能解释观察到的行为last_insert_id。)

复制

而且这个讨论完全忽略了涉及复制的可能性,即该6073值可能是由不同的服务器生成的。显然,ClearDB 支持“多主”复制。

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

事务是否有可能在两个不同的 MySQL 服务器之间“拆分”?

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


使用该last_insert_id功能有很多注意事项。必须从同一个会话中调用,紧接着一个成功的插入(或更新)生成一个 AUTO_INCREMENT 值,yada,yada,yada。

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

于 2015-05-06T15:00:43.213 回答