这是我当前的表格,其中包含一些行:
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)
当我这样做时,它不是替换最后一行(包含那些确切的值)而是添加一个新行。为什么?谢谢!
答案 0 :(得分:1)
REPLACE
使用UNIQUE CONSTRAINT
的(唯一索引)来确定哪些行是“重复”。
在您的表中,唯一的唯一约束是PRIMARY KEY,并且未在INSERT
中指定。
答案 1 :(得分:1)
这是因为您没有指定主键,即插入中的id_user_versus
。
也许您打算在id_user_winner
和id_user_loser
之间使用唯一键(而不仅仅是标准键),在这种情况下,您的替换可以用这些值替换行。
答案 2 :(得分:0)
REPLACE
“匹配”表格的PRIMARY KEY
(或UNIQUE
索引)。我在插入语句中没有看到您的主键(id_user_versus
)。
答案 3 :(得分:0)
如果找到具有相同主键和唯一键的现有行,则REPLACE
语句仅替换行。
MySQL文档指定:
REPLACE的工作原理与INSERT完全相同,只是如果在一个旧行中 table与PRIMARY KEY或UNIQUE的新行具有相同的值 index,在插入新行之前删除旧行。
来源:http://dev.mysql.com/doc/refman/5.1/en/replace.html
此查询中未指定此表中的主键,因此不会替换该行。