2015-02-11 38 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;