2016-01-11 103 views
1

我有一个数据库需要在重复键的情况下处理2个特殊场景。在每一种情况下,我需要获得该行的唯一ID是否有重复的记录,或不当没有更新时获取INSERT DUPLICATE KEY UPDATE语句的last_insert_id

方案1的record_count场必须增加1。所以MySQL的语法如下

INSERT INTO (id, value, record_count) VALUES ('foo','bar', 1) ON DUPLICATE KEY UPDATE record_count=record_count+1 

在这种情况下,$mysqli->insert_id方法为我提供正确的值,无论它是新记录还是重复记录。一切都很好。

场景#2record_count字段不需要增加。我尝试以下3个语句

INSERT IGNORE INTO (id, value, record_count) VALUES ('foo','bar', 1) 

INSERT INTO (id, value, record_count) VALUES ('foo','bar', 1) ON DUPLICATE KEY UPDATE record_count=record_count 

INSERT INTO (id, value, record_count) VALUES ('foo','bar', 1) ON DUPLICATE KEY UPDATE record_count=record_count+1-1 

但是在每种情况下$mysqli->insert_id正在取得我0,因为我不更新或插入任何东西。我想我可以通过加1和减1来愚弄它,但没有运气。

解决方法是什么?我真的不想使用SELECT声明(我每分钟发送数百个查询,我真的不想增加系统负载)

+0

什么是你的表的主键?由于您使用的是PHP,因此您可以使用php – SIDU

+0

主键为id来计算要插入值后插入的值 – hvs

+0

添加更新的“TIMESTAMP”列? – miken32

回答

0

因为,我还没有收到任何答案,这里是我正在做的。

我创建了另一个存储md5散列的虚拟列。当我不想更新record_count时,我更新了虚拟列,以便可以获取列的ID。

正如@ miken32建议的那样,我也可以使用timestamp列(这可能更有效)。

还在寻找更好的答案,如果存在。

+0

只需使用传递给查询的值来选择唯一约束呢?为什么复杂?如果'last_insert_id'返回0,请使用您尝试插入的那些值进行选择。创建一个围绕这些和瞧,简单的包装,完成工作,不需要改变表或使用时间戳。 –

0

mysql_insert_id() documentation详细说明了所有情况,但明确详细信息INSERT ... ON DUPLICATE KEY UPDATE仅在数据库发生实际更改时才更新。

因此,要从MySQL中获取插入ID,您必须在数据库更改中使变为。如上所述,时间戳列将适合该法案。或者,您可以使用递增计数器列,如果这会稍后为您提供更多有用的信息。

相关问题