MySQL:如果不存在高级插入
我有一个表,基本上有三列:user_id、setting和value。我正在尝试使用以下代码:MySQL:如果不存在高级插入,mysql,key,duplicates,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, 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'
不影响任何行。很明显我错过了什么
重要信息:我无法更改数据库(新的主键或其他内容)
更新:看来我对重复键上的的理解是错误的。但问题依然存在——实现这一目标的最有效方式是什么
在下面的评论中回答说:“如果主键(或唯一键)是(用户id,设置),那么使用:…在重复键上更新值=999”。假设您在用户id
上确实有一个唯一键,您将得到“不受影响的行”,因为您在第二个查询中没有更改任何内容。我认为您要做的是更新值
字段:
INSERT INTO 'user_settings'(user_id, setting, value)
VALUES (1234, setting_1, 999)
ON DUPLICATE KEY UPDATE setting = setting_1,value=999
如果没有value
,您只需将user\u id
和setting
字段设置为与以前相同的值,MySQL不需要更新记录
如果您在用户id
上没有唯一的密钥,您必须找到不同的方法,因为重复密钥更新的不会触发。主键是什么?我认为您不应该在更新部分分配用户id
,因为这已经是导致插入错误的键。主键没有列出-表中有更多的列不是真正相关的。在user\u id
上没有唯一的键,所以似乎我在重复键上使用的是错误的。你知道我应该用什么方法吗?@Luke:PK是什么?表中还有其他唯一键吗?如果主键(或唯一键)是(用户id,设置)
,则使用:。。。在重复键更新值=999时
。还有两列实际上不相关-一个id
和一个时间戳
列<代码>用户id
和设置
不是唯一的。单个用户将具有多个设置,而多个用户将具有相同的设置。但是单个用户不能有不同值的重复设置。@ypercube,你做到了!事实证明,我们出色的DBA已经将(用户id,设置)
设置为唯一。我希望你把它作为一个答案而不是评论,因为我会把你的作为答案。