在MySQL中使用REPLACE实际上并没有替换行

时间:2013-11-20 22:56:06

标签: mysql sql replace

这是我当前的表格,其中包含一些行:

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)

当我这样做时,它不是替换最后一行(包含那些确切的值)而是添加一个新行。为什么?谢谢!

4 个答案:

答案 0 :(得分:1)

REPLACE使用UNIQUE CONSTRAINT的(唯一索引)来确定哪些行是“重复”。

在您的表中,唯一的唯一约束是PRIMARY KEY,并且未在INSERT中指定。

答案 1 :(得分:1)

这是因为您没有指定主键,即插入中的id_user_versus

也许您打算在id_user_winnerid_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

此查询中未指定此表中的主键,因此不会替换该行。