mysql使用多个主键进行REPLACE查询

时间:2011-07-12 21:51:30

标签: mysql replace

所以MYSQL的REPLACE命令(不要与字符串替换函数混淆)如果存在与插入数据具有相同主键的列,则替换一行...

但是如果我有两个主键并且我想同时使用它们来指定要替换的行而不仅仅是其中一个...如何指定mysql来使用两个键而不仅仅是一个

1 个答案:

答案 0 :(得分:5)

它应该没有区别,它是相同的语法。请确保将两个键都指定为列。例如:

REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` /* , ... */ )
  VALUES ( 'widgets', 14, 'Blue widget with purple trim' );

修改

这是我在测试数据库中运行的测试,以确保我不会破坏您的数据。当然,如果你不确定,我鼓励你尝试一下!

CREATE SCHEMA `my_testdb`;
USE `my_testdb`;
CREATE TABLE `my_table` (
  `key1` VARCHAR(20) NOT NULL,
  `key2` INTEGER NOT NULL,
  `othercolumn1` VARCHAR(50),
  CONSTRAINT PRIMARY KEY (`key1`, `key2`) );
REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` )
  VALUES ( 'widgets', 14, 'Green widget with fuchsia trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` )
  VALUES ( 'widgets', 15, 'Yellow widget with orange trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` )
  VALUES ( 'thingamabobs', 14, 'Red widget with brown trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` )
  VALUES ( 'widgets', 14, 'Blue widget with purple trim' );
SELECT * FROM `my_table`;

这是我的结果:

key1          key2  othercolumn1
widgets       14    Blue widget with purple trim
widgets       15    Yellow widget with orange trim
thingamabobs  14    Red widget with brown trim

另一个编辑

我想我在文档中看到了你在谈论的内容,对独特专栏的混淆:

  

如果表包含多个唯一索引,并且新行重复不同唯一索引中不同旧行的值,则单行可能会替换多个旧行。 - MySQL文档

这指的是一个相当人为的情况,其中您要替换的行不仅与现有主键冲突,而且还与其他唯一列冲突。这是另一个说明这一点的例子:

CREATE SCHEMA `my_testdb2`;
USE `my_testdb2`;
CREATE TABLE `my_table` (
  `key1` VARCHAR(20) NOT NULL,
  `key2` INTEGER NOT NULL,
  `color` VARCHAR(20) NOT NULL UNIQUE,
  `othercolumn1` VARCHAR(50),
  CONSTRAINT PRIMARY KEY (`key1`, `key2`) );
REPLACE INTO `my_table` ( `key1`, `key2`, `color`, `othercolumn1` )
  VALUES ( 'widgets', 14, 'green', 'Green widget with fuchsia trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `color`, `othercolumn1` )
  VALUES ( 'widgets', 15, 'yellow', 'Yellow widget with orange trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `color`, `othercolumn1` )
  VALUES ( 'thingamabobs', 14, 'red', 'Red widget with brown trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `color`, `othercolumn1` )
  VALUES ( 'widgets', 14, 'yellow', 'Yellow widget with purple trim' );
SELECT * FROM `my_table`;

注意最后一次REPLACE操作不仅与第一个REPLACE的(key1key2)主键冲突,而且还与第二个REPLACE的唯一颜色冲突。在这种情况下,在执行最后一次REPLACE操作之前删除BOTH行,以便结果不冲突。你最终只会有两行:

key1          key2  color   othercolumn1
widgets       14    yellow  Yellow widget with purple trim
thingamabobs  14    red     Red widget with brown trim

key1key2)的行等于('小部件',14) AND ,颜色为“黄色”的行被吹走了新行与表中的多个唯一约束冲突。

希望这有帮助!