Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:如果不存在高级插入_Mysql_Key_Duplicates - Fatal编程技术网

MySQL:如果不存在高级插入

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' 这在创建新设置时非常有效,并且不会生成重复记录。当我想要更改该值时,会出现问题-在上一个查询运行后,这将不起作用:

我有一个表,基本上有三列: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'
不影响任何行。很明显我错过了什么

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

更新:看来我对重复键上的
的理解是错误的。但问题依然存在——实现这一目标的最有效方式是什么


在下面的评论中回答说:“如果主键(或唯一键)是(用户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,设置)
设置为唯一。我希望你把它作为一个答案而不是评论,因为我会把你的作为答案。