MySQL:ON DUPLICATE KEY UPDATE不适用于主键

时间:2017-02-25 13:58:17

标签: mysql primary-key

我希望在主服务器已存在时更新MySQL行。问题是查询在第二次执行时没有更新任何内容。

表结构:

mysql> DESCRIBE Testtable;
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| test_id      | int(11)      | NO   | PRI | NULL    |       |
| test_varchar | varchar(128) | NO   |     | NULL    |       |
| test_text    | text         | NO   |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

查询:

INSERT INTO `Testtable`(`test_id`, `test_varchar`, `test_text`) VALUES ('1', 'hello', 'hello world!') ON DUPLICATE KEY UPDATE `test_id` = '1';

首次执行的结果:

  

查询OK,1行受影响(0.01秒)

第二次执行的结果:

  

查询OK,0行受影响(0.00秒)

我不明白为什么0行受到影响,因为在manual中它说:

  

如果指定ON DUPLICATE KEY UPDATE,则插入一行   将导致UNIQUE索引中的重复值或 PRIMARY KEY ,MySQL   执行旧行的更新。

是的,我有一个主键,你可以在结构中看到,但我不明白为什么0行会受到影响。如何优化查询它将起作用?我是否需要在ON DUPLICATE KEY UPDATE - part?

中再次指定所有变量

1 个答案:

答案 0 :(得分:2)

根据https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

  

如果ON DUPLICATE KEY UPDATE,则每行的受影响行值为1   该行将作为新行插入,如果现有行已更新,则为2,和   如果现有行设置为其当前值,则为0