如果无法更新UNIQUE KEY,“ON DUPLICATE KEY UPDATE”会抛出错误吗?

时间:2013-11-09 00:39:50

标签: mysql node.js

我有一个问题,当我使用" 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 }

任何有助于弄清楚为什么这似乎给我错误反馈的帮助也会有所帮助。

3 个答案:

答案 0 :(得分:0)

但它确实使用相同的名称更新。唯一键只能阻止两个相同的值而不是具有相同值的更新。不是指你的意思

ON DUPLICATE KEY UPDATE id=VALUES(id)

答案 1 :(得分:0)

ON DUPLICATE KEY子句没有 need 来更新唯一键。它已经存在了。只需从更新中删除该列。

答案 2 :(得分:0)

经过一番调查后,我觉得我找到了答案。来自mysql文档“INSERT ... ON DUPLICATE KEY UPDATE Syntax”

  

通常,您应该尽量避免使用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

其中没有给我关于刚刚发生的事情的反馈。