2011-07-12 64 views
5

所以MySQL的REPLACE命令(不要与字符串混淆替换功能),如果存在与所插入的数据相同的主键列代替行...MySQL的REPLACE查询有多个主键

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

+1

根据定义,表格只能有一个PK。你的意思是独特的钥匙? – Jason

+0

我很确定他的意思是一个多列主键。 –

+1

你不能有两个主键。你的意思是你有一个复合主键? – Flimzy

回答

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 

ANOTHER编辑

我想我明白你的文档中说些什么,混乱了独特的列:

如果表con是单行可以替换多个旧行保留了多个唯一索引,并且新行为不同的唯一索引中的不同旧行重复了值。 - 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`; 

注意如何最后的替换操作不仅发生冲突与(key1key2)主键,第一代替,但也与第二个独特的颜色。在这种情况下,在执行最后一次REPLACE操作之前删除BOTH行,以使结果不冲突。你会只用两行结束:

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

都与(key1key2)等于(“小部件”,14)与色列行“黄”被吹走因到与表格上的多个唯一约束冲突的新行。

希望这会有所帮助!

+2

是真的......我的理解是,如果多个键中的任何一个都重复,REPLACE将会被替换....我想要的方式是,如果两个键都是重复的,而不仅仅是其中的一个。 ..纠正我,如果我错了 – pillarOfLight

+1

是的,这是真的。我只是在我创建的测试数据库上运行它以确保我没有误解,并且它只替换了两列匹配的值,而不是/或。如有疑问,请旋转! –

+0

@ user841626:我也是这样阅读文档的。尽管如此,你可能只需要测试它看看它是如何表现的。 – Flimzy