2013-11-20 15 views
1

這是我目前的表中有一些行:使用在MySQL取而代之的是沒有實際替代

CREATE TABLE `user_versus` (
    `id_user_versus` int(11) NOT NULL AUTO_INCREMENT, 
    `id_user_winner` int(10) unsigned NOT NULL, 
    `id_user_loser` int(10) unsigned NOT NULL, 
    `id_user` int(10) unsigned NOT NULL, 
    `date_versus` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id_user_versus`), 
    KEY `id_user_winner` (`id_user_winner`,`id_user_loser`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=14 ; 

INSERT INTO `user_versus` (`id_user_versus`, `id_user_winner`, `id_user_loser`, `id_user`, `date_versus`) VALUES 
(1, 6, 7, 1, '2013-10-25 23:02:57'), 
(2, 6, 8, 1, '2013-10-25 23:02:57'), 
(3, 6, 9, 1, '2013-10-25 23:03:04'), 
(4, 6, 10, 1, '2013-10-25 23:03:04'), 
(5, 6, 11, 1, '2013-10-25 23:03:10'), 
(6, 6, 12, 1, '2013-10-25 23:03:10'), 
(7, 6, 13, 1, '2013-10-25 23:03:18'), 
(8, 6, 14, 1, '2013-10-25 23:03:18'), 
(9, 7, 6, 2, '2013-10-26 04:02:57'), 
(10, 8, 6, 2, '2013-10-26 04:02:57'), 
(11, 9, 8, 2, '2013-10-26 04:03:04'), 
(12, 9, 10, 2, '2013-10-26 04:03:04'), 
(13, 9, 11, 2, '2013-10-26 04:03:10'); 

現在,我想插入或者與此查詢替換最後一行:

REPLACE INTO user_versus (id_user_winner, id_user_loser, id_user) VALUES (9, 14, 2) 

當我這樣做,而不是取代最後一行(包含這些確切的值),它是添加一個新的行。爲什麼?謝謝!

回答

1

這是因爲您沒有在插入中指定主鍵,即id_user_versus

也許你打算在id_user_winnerid_user_loser之間有一個唯一的密鑰(而不僅僅是一個標準密鑰),在這種情況下,你的替換將用這些值替換該行。

+0

這是最完整的答案。有效。謝謝! – andufo

0

REPLACE表中PRIMARY KEY(或UNIQUE索引)上的「匹配」。我在您的插入語句中看不到您的主鍵(id_user_versus)。

0

如果找到具有相同主鍵和唯一鍵的現有行,則REPLACE語句只會替換一行。

MySQL的文件規定:

更換作品酷似INSERT,不同之處在於,如果一個老行的 表具有相同的值PRIMARY KEY或一個UNIQUE 指數,新行舊行在插入新行之前被刪除。

來源:http://dev.mysql.com/doc/refman/5.1/en/replace.html

在此表的主鍵是不是在你的查詢中指定的,所以它不會取代該行。

1

REPLACE使用UNIQUE CONSTRAINT的(唯一索引)來確定哪些行是「重複的」。

在您的表中唯一的唯一約束是PRIMARY KEY,並且在INSERT中沒有指定。