2011-07-12 106 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