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

pil*_*ght 5 mysql replace

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

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

Kin*_*pus 5

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

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

编辑

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

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`;
Run Code Online (Sandbox Code Playgroud)

这是我的结果:

key1          key2  othercolumn1
widgets       14    Blue widget with purple trim
widgets       15    Yellow widget with orange trim
thingamabobs  14    Red widget with brown trim
Run Code Online (Sandbox Code Playgroud)

另一个编辑

我想我在文档中看到了你在谈论的内容,对独特列的困惑:

如果表包含多个唯一索引,并且新行为不同唯一索引中的不同旧行重复值,则单行可以替换多个旧行.- 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`;
Run Code Online (Sandbox Code Playgroud)

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

key1          key2  color   othercolumn1
widgets       14    yellow  Yellow widget with purple trim
thingamabobs  14    red     Red widget with brown trim
Run Code Online (Sandbox Code Playgroud)

都与该行(key1,key2)等于("部件",14)与所述颜色"黄色"的行被吹走,由于新的行与上表中的多个独特的限制相冲突.

希望这可以帮助!

  • 这是真的...我理解的方式是,如果多个键中的任何一个是重复的,REPLACE将替换....我想要的方式是,如果键的两个重复,而不仅仅是其中之一.. .如我错了请纠正我 (2认同)