ЗАМЕНИТЬ оператор со встроенной логикой IF ()? - PullRequest
1 голос
/ 14 июня 2011

РЕДАКТИРОВАТЬ: Это на самом деле работает нормально, не знаю, почему я думал иначе.

У меня есть таблица цен, которая включает столбец price_was, который должен содержать самое высокое значение цен за все время.

Можно ли выполнить запрос REPLACE, который бы обновил его при необходимости?

Следующее (которое упрощенно и динамически создается в PHP), похоже, не работает.

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

Я думаю, что, возможно, это невозможно, но хотелось бы услышать иначе, так как я обновляю много записей и должна быть максимально эффективной.

Ответы [ 2 ]

2 голосов
/ 14 июня 2011

Отправленный вами запрос действительно действителен, попробуйте сами. Я бы использовал ОБНОВЛЕНИЕ, так как вы обновляете только одно поле, и ЗАМЕНА может перезаписать другие данные столбца, которые вы хотите оставить в покое.

0 голосов
/ 14 июня 2011

Попробуйте INSERT ... ON DUPLICATE KEY UPDATE вместо:

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, тогда как оператор REPLACE выполняет либо INSERT, либо DELETE, за которым следует INSERT. Вы не можете ссылаться на старые значения в операторе REPLACE, возможно, из-за семантики DELETE / INSERT. От документов :

Значения для всех столбцов взяты из значения, указанные в ЗАМЕНА заявление. Все пропущенные столбцы установлены к их значениям по умолчанию, так же, как бывает для вставки. Вы не можете сослаться к значениям из текущей строки и использовать их в новом ряду. Если вы используете назначение, такое как SET col_name = col_name + 1, ссылка на Название столбца с правой стороны трактуется как DEFAULT (col_name), поэтому назначение эквивалентно SET col_name = DEFAULT (col_name) + 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...