3

DATE私は単に (更新)を置き換えたいだけPRICEで、価格が一意 OLDPRICEのテーブルの PRICE と異なる場合。MODEL

サンプル行テーブル データ:

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

本質的な構文はUPDATEMODELが同じでもPRICEが異なる場合です。オンにOLDPRICEなるPRICEUPDATE

*更新*

これは、価格が変更されたかどうかに関係なく置き換えられます。価格が変更された場合にのみ更新/交換が必要です。つまり、上記の例は更新されませんが、日付が異なるため更新されます。

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

3 に答える 3

2

MySQL には、この目的専用のREPLACEステートメントがあります。

REPLACE は INSERT とまったく同じように機能しますが、テーブル内の古い行が PRIMARY KEY または UNIQUE インデックスの新しい行と同じ値を持つ場合、新しい行が挿入される前に古い行が削除される点が異なります。

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

于 2012-04-20T18:24:02.113 に答える
1

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

INSERT INTO..ON DUPLICATE KEY UPDATE名前が示すように、重複がない限り、テーブルに新しい行を挿入します。重複がない場合は、行を更新して(行を削除して新しい行を追加する代わりに)、テーブルの順序を同じにします。

于 2012-04-20T18:29:29.613 に答える
0

更新に基づいて、オプション 1、アップサート、別名 を使用する必要があります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);
于 2012-04-20T19:37:24.713 に答える