2011-07-12 19 views
5
でクエリをREPLACE

ので、MySQLのREPLACEコマンドが...(ファンクション置き換える文字列と混同しないように)挿入されたデータと同じ主キーを持つ列が存在する場合は、行を置き換えは、MySQLの複数の主キー

が、私は2つの主キーを持っていて、どちらか一方だけを置き換える行を指定するために両方を使用したいのですがどうすればよいですか?

+1

表は定義上、単一のPKのみを持つことができます。ユニークなキーを意味しますか? – Jason

+0

私は彼が複数列の主キーを意味していたと確信しています。 –

+1

2つの主キーを持つことはできません。複合主キーがあることを意味しますか? – Flimzy

答えて

5

違いは、それは同じ構文です。両方のキーが列として指定されていることを確認してください。たとえば、次のように

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

EDIT

ここで私は、私はあなたのデータを破壊する程度ではなかったことを確認するために私のテストデータベースに走った私のテストです。もちろん、わからない場合は試してみることをお勧めします。

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 EDIT

は、私はあなたが、文書にユニークな列の混乱を話しているか見て思う:

テーブルconの場合、複数の古いローを1つのローで置き換えることは可能です複数のユニークなインデックスがあり、新しいローは異なるユニークなインデックスの異なる古いローの値を複製します。 - MySQLのドキュメントの行はあなたにも、既存の主キーを持つが、他のユニークな列を持つだけでなく、競合に置き換えていたではなく、不自然な状況を参照することだ

。最後は第一、第二1のユニークな色でもREPLACEが、の(key1key2)主キーと操作だけでなく、競合をREPLACE方法

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操作が実行される前にBOTH行が削除され、結果は競合しません。

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

色「黄色」と(key1key2)に等しいと行(「ウィジェット」、14)行が原因吹き飛ばされた両方:あなたはわずか2行になってしまいますテーブル上の複数の一意の制約と競合する新しい行に移動します。

希望すると便利です。

+2

それは本当です...私は理解している方法は、複数のキーのいずれかが重複している場合、置換が置き換えられることです....私がそれを望む方法は、両方のキーが重複していれば、そのうちの1つではありません。 ..私が間違っているなら私を訂正してください – pillarOfLight

+1

はい、それは本当です。私はちょうど私がmisrememberingしていないことを確認するために作成したテストデータベースでそれを実行し、両方の列が一致する値を置き換えます。疑いがあるときは、それを渦巻きにしてください! –

+0

@ user841626:これは私がドキュメントを読む方法です。あなたはそれがどう動くか見るためにそれをテストしなければならないかもしれません。 – Flimzy

関連する問題