2015-02-11 56 views
1

我有以下表定义:MySQL在重复键更新插入 - 独特

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

此行为被设计。您的值未被删除,但已更新。这是来自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;