我有一个问题,当我使用" ON DUPLICATE KEY UPDATE"使用UNIQUE字段时会出现静默故障。这是场景:
1)我有一个这样的映射表:
CREATE TABLE index_user_username (
username VARCHAR(255) NOT NULL UNIQUE,
id INT NOT NULL UNIQUE,
PRIMARY KEY (username, id)
);
通知username
标记为UNIQUE
2)我插入了几个条目:
mysql> INSERT INTO index_user_username (username,id) VALUES ('dude', 1) ON DUPLICATE KEY UPDATE username=VALUES(username);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO index_user_username (username,id) VALUES ('man', 2) ON DUPLICATE KEY UPDATE username=VALUES(username);
Query OK, 1 row affected (0.00 sec)
这是我对db的理智检查:
mysql> SELECT * FROM index_user_username;
+----------+----+
| username | id |
+----------+----+
| dude | 1 |
| man | 2 |
+----------+----+
2 rows in set (0.00 sec)
3)我将其中一行更新为其他用户名之一,但我没有失败(我得到" Query OK
"):
mysql> INSERT INTO index_user_username (username,id) VALUES ('dude', 2) ON DUPLICATE KEY UPDATE username=VALUES(username);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM index_user_username;
+----------+----+
| username | id |
+----------+----+
| dude | 1 |
| man | 2 |
+----------+----+
2 rows in set (0.00 sec)
所以我的主要问题是,不应该抛出错误吗?如果没有,有关工作选项的任何建议(另请参见下面的注释)?另外,我正在运行5.6.13版本
澄清: " id"字段映射到另一个表。这是一个唯一的username-to-userId映射表。
作为旁注:我注意到在命令行中我得到一个响应,告诉我有多少行受到影响,并认为我可以做一些检查并在我的代码中抛出一个错误如果0个受影响的行出现。但是,我使用node.js模块(https://github.com/felixge/node-mysql)实现了这一切,它似乎为所有上述INSERT语句返回相同的响应:
{ fieldCount: 0,
affectedRows: 1,
insertId: 0,
serverStatus: 2,
warningCount: 0,
message: '',
protocol41: true,
changedRows: 0 }
任何有助于弄清楚为什么这似乎给我错误反馈的帮助也会有所帮助。
答案 0 :(得分:0)
但它确实使用相同的名称更新。唯一键只能阻止两个相同的值而不是具有相同值的更新。不是指你的意思
ON DUPLICATE KEY UPDATE id=VALUES(id)
答案 1 :(得分:0)
ON DUPLICATE KEY子句没有 need 来更新唯一键。它已经存在了。只需从更新中删除该列。
答案 2 :(得分:0)
通常,您应该尽量避免使用ON DUPLICATE KEY UPDATE 具有多个唯一索引的表的子句。
(我认为这部分是因为UNIQUE的多次比赛中的模糊性,就像我的情况一样)
另外,从node.js方面来看,我相信我找到了一种解决方法,可以让我弄清楚更新后发生了什么并做出相应的响应。我发现了一些描述我遇到的类似问题的问题/拉动,例如:
指出我将FOUND_ROWS列入黑名单:
所以,给定:
CREATE TABLE index_user_username (
username VARCHAR(255) NOT NULL UNIQUE,
id INT NOT NULL UNIQUE,
PRIMARY KEY (username, id)
);
如果我有以下脚本:
var mysql = require('mysql');
var connection = mysql.createConnection('mysql://root:rootpass@localhost/user?flags=-FOUND_ROWS');
connection.connect()
connection.query('INSERT INTO index_user_username (username,id) VALUES (\'dude\', 1) ON DUPLICATE KEY UPDATE username=VALUES(username)', function(err,result) {
console.log('1:',result.affectedRows)
connection.query('INSERT INTO index_user_username (username,id) VALUES (\'man\', 2) ON DUPLICATE KEY UPDATE username=VALUES(username)', function(err,result) {
console.log('2:',result.affectedRows)
connection.query('INSERT INTO index_user_username (username,id) VALUES (\'dude\', 2) ON DUPLICATE KEY UPDATE username=VALUES(username)', function(err,result) {
console.log('3:',result.affectedRows)
connection.query('INSERT INTO index_user_username (username,id) VALUES (\'dude\', 3) ON DUPLICATE KEY UPDATE username=VALUES(username)', function(err,result) {
console.log('4:',result.affectedRows)
connection.end()
})
})
})
})
我得到了输出:
1: 1
2: 1
3: 0
4: 0
这就是我需要的,以前我得到的地方:
1: 1
2: 1
3: 1
4: 1
其中没有给我关于刚刚发生的事情的反馈。