Обновление MySQL с дополнительной проверкой

Я хотел бы выполнить немного сложную операцию upsert, используя 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(описание) даст мне значение существующей записи (т.е. «существующее описание») в таблице БД. Однако, похоже, это дает мне то, что я пытался вставить, то есть «некоторое описание».

Кто-нибудь знает, как это сделать правильно с помощью SQL. Как лучше всего ссылаться на значение в существующей записи при попытке обновления?


person Brian Park    schedule 09.02.2013    source источник


Ответы (1)


Простой. Не используйте 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))
person eggyal    schedule 09.02.2013
comment
хаха. О, это было так просто! Спасибо за ответ @eggyal! - person Brian Park; 10.02.2013