2012-04-20 10 views
3

価格がMODELが一意である私のテーブルの価格と異なる場合、単に(更新)DATEPRICEおよびOLDPRICEを交換したいと考えています。行が重複しない場合はINSERT?

サンプル行表データ:

DATE  | MAKE | MODEL | PRICE | OLDPRICE 
2012-04-15 | Advance | DTA-100-X | 400  | 390 

これを行うにはダースの方法があるに違いありませんが、私は、MySQLのクエリで使用するのに最適な解決策を探しています。

私が使用している必要があります。

  1. INSERT INTO..ON DUPLICATE KEY UPDATE
  2. REPLACE INTO..
  3. UPDATE...WHERE PRICE != XXX

MODELは同じですがPRICEが異なる場合は必須構文はUPDATEになります。これは、価格が変更されたか否かREPLACES PRICE

* * UPDATE

UPDATEOLDPRICEになります。私はしかし、それは日付が違うんので、更新は/価格はすなわち変更された場合、これは例上で与えられたものを更新するべきではありません置き換えたい:

REPLACE INTO MyTable (DATE, MAKE, MODEL, PRICE, OLDPRICE) VALUES ('2012-10-02', 'Advance', 'DTA-100-X', '400', '390') 
+3

便利な用語は、「アップサート」(UPDATEとINSERTの組み合わせ)です。 –

+0

私は数年間、方法番号1を使用していますが正常に動作します。すでに一致するキーがない場合は、1と2の両方が新しいデータをテーブルに挿入します。 –

答えて

2

MySQLは、この目的のために特別にREPLACE statementを持っています。

正確INSERTのような作品をREPLACE、そのテーブルの古い行がPRIMARY KEYまたはUNIQUEインデックスの新しい行と同じ値を持っている場合を除いて、新しい行が挿入される前に、古い行が削除されます。

からhttp://dev.mysql.com/doc/refman/5.6/en/replace.html

+1

行が実際に*削除*されていることに注意してください。あなたのデータにその瞬間的な不連続性がある場合は、これはかなり簡単です。 –

+0

これは、PRICEがその行と異なる場合を除き、すべてのデータを挿入または更新しない限り必要なものです。 – ToddN

+1

新しい値がまったく同じであっても、置換は常に削除と挿入を行います古い値 –

1

あなたがテーブルの順序を気にする場合は、INSERT INTO..ON DUPLICATE KEY UPDATEを使用しています。 REPLACE古い行を削除し、重複が見つかった場合は新しい行を追加します。

INSERT INTO..ON DUPLICATE KEY UPDATE名前が示唆するように、重複がない限り、新しい行がテーブルに挿入されます。この場合、行が削除され、新しい行が追加されます。同じテーブル。

+0

これは' REPLACE'と比べても速いでしょうか? – ToddN

+0

質問はやや曖昧ですが、手元にある情報を参考にすれば、より効率的で低侵襲であるため、これを置き換えてお勧めします。 –

0

アップデートに基づいて、オプション1、upsert、別名INSERT...ON DULICATE KEY UPDATEを使用する必要があります。

モデルに差額が既に存在する場合は、PRICEとOLDPRICE(DATEまたはMAKEではなく)のみを更新したいと思っています。そのような場合、これはあなたのために働く必要があります。

このよう

INSERT INTO MyTable (DATE, MAKE, MODEL, PRICE, OLDPRICE) 
VALUES ('2012-10-02', 'Advance', 'DTA-100-X', '410', '390') 
ON DUPLICATE KEY UPDATE OLDPRICE = CASE WHEN PRICE != VALUES(PRICE) THEN PRICE ELSE OLDPRICE END, 
    DATE = CASE WHEN PRICE != VALUES(PRICE) THEN VALUES(DATE) ELSE DATE END, 
    PRICE = VALUES(PRICE); 
+0

ありがとうございます。価格も変更された場合はDATEも更新したいと思います。 – ToddN

+0

ありがとうございます。それに応じてサンプルクエリを更新しました。 –

関連する問題