2016-06-05 6 views
0

Ich brauche Arbeit meinen created_on Datetime-Feld Wert NOW() nur dann, wenn der alte Wert für is_active Feld 0 war zu aktualisieren und zu ändern 1.Bedingt durch doppelte Schlüssel Update nicht korrekt

+-----------+---------+-----------+---------------------+---------------------+ 
| 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 | 

was hier ich habe so weit gekommen:

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(); 

Aber es funktioniert nicht, und der Wert des created_on Feld ist immer auf NOW().

EDIT 1:

Ich möchte den Wert für created_on Feld zu aktualisieren, um NOW() ON DUPLICATE KEY, nur dann, wenn der Wert war die is_active Feld 0 vor und ist 1 in der angegebenen Abfrage.

EDIT 2:

Ich verwende die folgende Abfrage basierend auf den Inhaber lautende Antwort @ring. Aber ich bekomme:

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 

Hier ist die genaue Abfrage ich verwende.

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

Was genau möchten Sie erreichen? Die von Ihnen angegebenen Daten beantworten diese Bedingung nicht. – sagi

+0

Der Wert von 'created_on' wird gemäß dem von Ihnen geschriebenen Code auf' NOW() 'gesetzt. Der Wert von 'is_active' ist 0, wenn Ihre Anweisung ausgeführt wird. In Ihrer Case-Anweisung sagen Sie, dass 'created_on' auf' NOw() 'aktualisiert werden sollte, wenn' is_active' auf 0 steht. – Incognito

Antwort

0

Sie möchten nur created_on, wo Sie values(created_on) haben. values ​​gibt den Wert zurück, auf den die Spalte gesetzt worden wäre, wenn es keinen doppelten Schlüssel gegeben hätte (der in Ihrem Fall jetzt() ist), nicht der alte Wert.

Spaltennamen im Aktualisierungsteil geben ihren alten Wert zurück, wenn Sie sie vor dem Festlegen verwenden. Also nur created_on ändern, wenn is_active von 0 auf 1 ändern, tun:

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); 

Werten anstelle von fest einprogrammiert 1 Verwendung oder NOW() macht richtig es, was Wert zu verwenden, wäre es verwendet wurde, hatte eine neue Zeile erstellt.

+0

Ich wusste nicht @ysth. Danke. Aber ich denke, dass dies mit Triggern getan werden muss, wie Ringträger in seiner Antwort beschreibt, da ich den vorherigen Wert von 'is_active' wissen muss. Ich habe Upvoted Sie, und es wird angezeigt, sobald ich 15 Wiederholungen haben. –

+0

ah, ich habe nicht bemerkt, dass ein Teil Ihrer Frage. Sie * brauchen * nicht, einen Auslöser zu verwenden, ich werde meine Antwort aktualisieren – ysth

0

Ich würde vorschlagen, einen Update-Trigger zu verwenden, um dies zum Funktionieren zu bringen. In diesem Trigger würden Sie die Änderung in das Feld is_active verfolgen und das erforderliche Feld auf den erforderlichen Wert setzen. Beispiel:

Während der Einfügung können Sie nur die NEW.is_active überprüfen und die Entscheidung treffen, wie oben gezeigt.

+0

Danke. Ich bin neu bei Triggern. Ich habe gerade Ihre Lösung ausprobiert und erhalte einen Syntaxfehler 'ERROR 1064 (42000):' nahe 'nahe '==' 0 '&& NEW.is_active ==' 1 'THEN'. Ich bearbeite meine Frage, um die genaue Abfrage hinzuzufügen, die ich verwende. Könnten Sie bitte einen Blick darauf werfen? –

+0

Und es tut mir leid, dass ich Sie wegen meines mageren Rufes nicht beleidigen kann. :( –

Verwandte Themen