2011-06-14 3 views
1

編集:これは実際にはうまく動作します、なぜ私は別の考えをしたのか分かりません。IF()ロジックが組み込まれたREPLACE文?

私は値段の高い値を含む必要がある列price_wasを含む価格表を持っています。

必要に応じてこれを更新するREPLACEクエリを実行できますか?

次は(簡略化され、PHPで動的に構築されています)、動作しないようです。

REPLACE prices 
SET  price = 1.99, 
     price_was = IF(1.99 > price_was, 1.99, price_was) 
     id_product = 1 

私はおそらくそれが不可能だと思っていますが、私は多くのレコードを更新していますので、それ以外の話を聞くのが大好き、できるだけ効率的であることが必要です。

+0

試したときに何が起こりましたか? –

+0

@Tomalak明らかにそれはうまく働いて、私はそうではないと思った! – jezmck

答えて

2

あなたが投稿したクエリは本当に有効です。あなた自身でそれを試してください。私はあなたが1つのフィールドを更新しているだけなので、UPDATEを使うでしょう。そして、REPLACEはあなたが残したい他のカラムデータを上書きする可能性があります。

+0

あなたは本当に正しいです。なぜ私はそれが動作していないと思ったのかわかりません。どのように奇妙な。 – jezmck

0

ではなくINSERT ... ON DUPLICATE KEY UPDATEをお試しください:REPLACE文がINSERTまたはINSERTが続くDELETEのいずれかを行いながら

INSERT INTO prices (price, price_was, id_product) 
    VALUES (1.99, 1.99, 1) 
ON DUPLICATE KEY UPDATE 
    price_was = IF(VALUES(price) > price_was, VALUES(price), price_was) 
    id_product = VALUES(id_product) 

これは、INSERTまたはUPDATEのいずれかを行います。おそらくDELETE/INSERTセマンティクスのために、REPLACEステートメントで古い値を参照することはできません。 the docsから:すべての列の

値は からREPLACE 文で指定された値を取っています。欠落している列は、 がデフォルト値に設定されます。ちょうど がINSERTに発生します。 を現在の行の値に参照することはできず、新しい行には を使用することはできません。このようなSETのCOL_NAME = COL_NAMEとして 割り当てを使用する場合は+ 1、右側の 列名への参照がDEFAULT(COL_NAME)として扱わ ので、 割り当て、設定する等価である COL_NAME = DEFAULT (col_name)+ 1

+1

これは、主キーの衝突があると仮定していることに注意してください。 – landoncz

+1

@landoncz - REPLACE文と同様にtrueです。 –