我有以下表格定义:
create table mytable(
a int,
b int,
c int,
primary key (a, b),
unique (b, c)
);
insert into mytable values (1,2,3);
select * from mytable;
+---+---+------+
| a | b | c |
+---+---+------+
| 1 | 2 | 3 |
+---+---+------+
以下陈述有一个令人惊讶的结果:
mysql> insert into mytable (a, b, c) values (2, 2, 3) on duplicate key update a = 2, b = 2, c = 3;
Query OK, 2 rows affected (0.00 sec)
mysql> select * from mytable;
+---+---+------+
| a | b | c |
+---+---+------+
| 2 | 2 | 3 |
+---+---+------+
1 row in set (0.00 sec)
我期望插入/更新由于唯一约束而失败。当我处理主键(2,2)时,我当然不希望用主键(1,2)删除记录。
这是一个错误???
答案 0 :(得分:0)
此行为已设计完成。您的值未删除,但已更新。这来自MySQL文档:
如果指定ON DUPLICATE KEY UPDATE,并且插入的行将导致UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行的UPDATE。例如,如果列a声明为UNIQUE并且包含值1,则以下两个语句具有相同的效果:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;