MySQL:高级插入(如果不存在)

时间:2011-08-24 23:28:58

标签: mysql key duplicates

我有一个基本上有三列的表:user_id,setting和value。我正在尝试使用以下代码:

INSERT INTO 'user_settings'(user_id, setting, value)
VALUES (1234, setting_1, 500)
ON DUPLICATE KEY UPDATE user_id = 1234, setting = setting_1'

这在创建新设置时效果很好,并且它不会生成重复记录。当我想要更改值时出现问题 - 这在上一个查询运行后无效:

INSERT INTO 'user_settings'(user_id, setting, value)
VALUES (1234, setting_1, 999)
ON DUPLICATE KEY UPDATE user_id = 1234, setting = setting_1'

没有行受到影响。显然我错过了一些东西......

重要:我无法更改数据库(新主键或其他内容)。

更新:似乎我对ON DUPLICATE KEY的理解是错误的。但问题仍然是 - 实现这一目标的最有效方式是什么?

在下面的评论中回答:“如果主要(或唯一)键是(user_id,设置),则使用:... ON DUPLICATE KEY UPDATE value = 999”。

1 个答案:

答案 0 :(得分:2)

假设您在user_id上确实有一个唯一键,则表示“没有行受影响”,因为您没有在第二个查询中更改任何内容。我想你想要做的就是更新value字段:

INSERT INTO 'user_settings'(user_id, setting, value)
VALUES (1234, setting_1, 999)
ON DUPLICATE KEY UPDATE setting = setting_1,value=999

如果没有value,您只需将user_idsetting字段设置为与之前相同的值,并且MySQL不需要更新记录。

如果您在user_id上没有唯一键,则必须找到不同的方法,因为ON DUPLICATE KEY UPDATE不会触发。