3

を使用して少し複雑なアップサート操作を実行したいと思いINSERT ... ON DUPLICATE KEY UPDATEます。しかし、私はそれを機能させることができませんでした。

これが私がやりたいことです:

  1. レコードを挿入してみてください。挿入が成功した場合、それは良いことです。
  2. そのレコードが存在する場合は、レコードを更新します。
  3. レコードを更新するときに、check_statusフィールドが1の場合、説明とコメントフィールドを残します。
  4. レコードを更新するときは、check_statusフィールドが0になり、説明とコメントフィールドも更新されます。

SQLを書き出す前に、some_tableに次のレコードがあると仮定しましょう。

column name      | val
-----------------+-------------------------
some_unique_key  | 32
description      | existing description
comment          | existing comment
check_status     | 1

したがって、上記の操作を実行するために、次のようにSQLを使用しました。

INSERT INTO some_table ('description', 'comment', 'some_unique_key')
VALUES ('some description', 'some comment', 32)
ON DUPLICATE KEY UPDATE
description = IF(check_status = 1, VALUES(description), 'some description')
comment = IF(check_status = 1, VALUES(comment), 'some comment')

VALUES(description)は、DBテーブル内の既存のレコード(つまり、「既存の説明」)の値を提供すると思いました。しかし、それは私が挿入しようとしたもの、すなわち「いくつかの説明」を私に与えているようです。

SQLを使用してこれを正しく行う方法を知っている人はいますか?アップサートを試みるときに既存のレコードの値を参照するための最良の方法は何ですか?

4

1 に答える 1

5

単純。使用しないでくださいVALUES()(の既存の値を参照するためにすでに実行していますcheck_status):

INSERT INTO some_table ('description', 'comment', 'some_unique_key')
VALUES ('some description', 'some comment', 32)
ON DUPLICATE KEY UPDATE
description = IF(check_status = 1, description, 'some description')
comment = IF(check_status = 1, comment, 'some comment')

または、繰り返すのではなく、新しいコンテンツを設定するために使用します。

INSERT INTO some_table ('description', 'comment', 'some_unique_key')
VALUES ('some description', 'some comment', 32)
ON DUPLICATE KEY UPDATE
description = IF(check_status = 1, description, VALUES(description))
comment = IF(check_status = 1, comment, VALUES(comment))
于 2013-02-09T23:28:22.937 に答える