2016-06-05 5 views
0

мне нужно обновить created_on DATETIME значение поля для NOW() только если старое значение is_active поля было 0, и это изменило 1.Условный на дубликат ключа обновления не работает правильно

+-----------+---------+-----------+---------------------+---------------------+ 
| device_id | user_id | is_active | created_on   | last_modified_on | 
+-----------+---------+-----------+---------------------+---------------------+ 
|   5 |  5 |   0 | 2016-06-05 03:31:48 | 2016-06-05 03:31:48 | 

Вот что я имею получил до сих пор:

INSERT INTO `device2users` 
(`device_id`, `user_id`, `is_active`, `created_on`, `last_modified_on`) 
VALUES 
(5, 5, 1, NOW(), NOW()) 
ON DUPLICATE KEY UPDATE 
`created_on` = CASE WHEN `is_active` <> 0 THEN VALUES(`created_on`) ELSE NOW() END, 
`is_active`=1, `last_modified_on`=NOW(); 

Но это не работает, и ценность created_on Филда всегда устанавливается в NOW().

EDIT 1:

Я хочу, чтобы обновить значение для created_on поля в NOW() ON DUPLICATE KEY, только если значение is_active месторождения было 0 до и в указанном запросе 1.

EDIT 2:

Я использую следующий запрос, основанный на @ring ответ предъявителя. Но я получаю:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '== '0' && NEW.is_active == '1' THEN 

Вот точный запрос, который я использую.

DELIMITER // 

CREATE TRIGGER created_on_after_update 
     AFTER UPDATE 
     ON `acd_device2users` FOR EACH ROW 

BEGIN 
     IF OLD.is_active == '0' && NEW.is_active == '1' THEN 
      SET `created_on`=NOW(); 
     END IF; 
END; // 

DELIMITER ; 
+0

Что именно вы хотите достичь? Предоставленные вами данные не отвечают этому условию. – sagi

+0

Значение 'created_on' будет установлено в' NOW() 'в соответствии с кодом, который вы написали. Значение 'is_active' равно 0, когда выполняется ваш оператор. В заявлении вашего дела вы говорите, что 'created_on' должен быть обновлен до' NOw() ', когда' is_active' равен 0. – Incognito

ответ

0

Вы хотите только created_on, где у вас есть values(created_on). значения возвращают значение, которое столбец был бы установлен, если бы не был дублирующий ключ (который теперь() в вашем случае), а не старое значение.

имена столбцов в части обновления возвращают свое старое значение, если вы используете их перед их настройкой. Таким образом, чтобы изменить только created_on если is_active меняется от 0 до 1, сделайте следующее:

ON DUPLICATE KEY UPDATE 
    created_on = CASE WHEN is_active=0 && VALUES(is_active)=1 THEN VALUES(created_on) ELSE created_on END, 
    is_active = VALUES(is_active), 
    last_modified_on = VALUES(last_modified_on); 

Использование ЗНАЧЕНИЯ вместо жёстко 1 или NOW() делает его правильно использовать любые значения, использовались бы, если бы создали новую строку.

+0

Я не знал, что @ysth. Спасибо. Но я думаю, что это нужно сделать с помощью триггеров, способ, которым кольцевой носитель описывает в своем ответе, так как мне нужно знать предыдущее значение 'is_active'. У меня есть вы увидите, как только у меня будет 15 повторений. –

+0

ах, я не заметил эту часть вашего вопроса. Вам не нужно использовать триггер, я обновлю ответ – ysth

0

Я бы предложил использовать триггер обновления, чтобы получить эту работу. В этом триггере вы должны отслеживать изменение в поле is_active и устанавливать необходимое поле в требуемое значение. Пример:

DELIMITER // 

CREATE TRIGGER created_on_after_update 
BEFORE INSERT 
    ON my_table FOR EACH ROW 

BEGIN 
     IF (NEW.is_active = '1') THEN 
     //Set required change. 
     END IF; 
END; // 

DELIMITER ; 

Во время вставки вы можете просто проверить NEW.is_active и принять решение, как показано выше.

+0

Спасибо. Я новичок в триггерах. Я просто попробовал ваше решение и получил синтаксическую ошибку 'ERROR 1064 (42000):' near 'near '==' 0 '&& NEW.is_active ==' 1 'THEN'. Я редактирую свой вопрос, чтобы добавить точный запрос, который я использую. Не могли бы вы взглянуть. –

+0

И я сожалею, что не могу упрекнуть вас из-за моей скудной репутации. :( –