2011-01-04 10 views
1

私はadhexが主キーである3つのフィールドを持つサンプルテーブルを持っています。現時点で私はASPとレコードセットを使用していますが、それは非常に遅く、PHPや高速システムに移行する必要があります。私は挿入をお勧めしている...重複キー更新は素晴らしい作品!重複したMySQL条件付き挿入

しかし、私は更新プログラムを条件付きにして欲しいと思います!

これまでのところ、私は全く動作しません以下を持っています!

更新が必要なのは、値のmtimeがテーブルの値より大きい場合にのみregとmtimeを更新することです。私はこれが単純なものだと確信していますが、私はいくつかの例を見ても条件付き部分を解決することはできません。

INSERT INTO testTable (adhex,reg,mtime) 
VALUES ('00B0BA','reg-1','1294129605') 
ON DUPLICATE KEY UPDATE reg='ZsS-SLD' 
    CASE 
    WHEN mtime < values(mtime) THEN values(mtime) 
    END 

答えて

2

INSERT ... ON DUPLICATEの構文を詳しく見てください。 ON DUPLICATE KEY UPDATEの後には、の列 = の式が続きます。

INSERT INTO testTable (adhex,reg,mtime) 
VALUES ('00B0BA','reg-1','1294129605') 
ON DUPLICATE KEY UPDATE reg=IF(mtime < VALUES(mtime), 'ZsS-SLD', reg), 
    mtime=IF(mtime < VALUES(mtime), VALUES(mtime), mtime) 
+1

実際に私は、2つの異なる文章を見て、次に値を挿入します。これを単一のifにブロックし、標準の更新文を実行する方法はありますか? –

+1

いいえ、構文で許可されていません。式の中に列を設定することはできません。また、前述のように、*列* = *式*を使って 'ON DUPLICATE KEY UPDATE'を実行する必要があります。 – outis

1

これは、CASEの動作ではありません。 SQLコードではなく値を返します。

Insert into testTable (adhex,reg,mtime) 
VALUES ('00B0BA','reg-1','1294129605') 
ON DUPLICATE KEY UPDATE reg=/*'ZsS-SLD'*/ CASE -- Note the commented out value 
    WHEN mtime < values(mtime) THEN values(mtime) 
    -- Notice there's not ELSE: you'll get NULL if condition is not matched 
END 
+0

ここで、regはnullではないはずですが、同じクエリでreg(および他のフィールド)を更新するにはどうすればよいですか? –

+1

ELSE句に適切な値を設定し、必要な数だけ列を更新してください。 –