2016-05-14 12 views
0

Ich habe diese Tabellen:Wie ermittelt man, welche Spalte aktualisiert wird?

// users 
+----+--------+--------------+------------+---------------------------+ 
| id | name | phone  | postalcode |   email   | 
+----+--------+--------------+------------+---------------------------+ 
| 1 | john | 0338294214 | 65462345 | [email protected]   | 
| 2 | jack | 0657359930 | 93827424 | [email protected]   | 
| 3 | peter | 0083247242 | 99849422 | [email protected]  | 
+----+--------+--------------+------------+---------------------------+ 

// notifications 
+----+---------+---------------+------------+ 
| id | user_id | content | timestamp | 
+----+---------+---------------+------------+ 
| 1 | 2  | phone updated | 1452642595 | 
+----+---------+---------------+------------+ 

Auch habe ich diesen Trigger AFTER UPDATE auf users Tisch ::

DELIMITER // 
CREATE TRIGGER `send_notification` AFTER UPDATE ON `users` 
FOR EACH ROW BEGIN 
    INSERT INTO notification(user_id, content, timestamp) 
        values(new.id, "phone updated", UNIX_TIMESTAMP()) 
END 
// 
DELIMITER 

Alles, was ich, dass Trigger zu tun bin versucht, ausgeführt wird, gerade als phone Spalte Aktualisierung. (nicht wenn name oder postalcode oder email Update). Wie kann ich diesen Zustand definieren?

Antwort

2

In einem Trigger können wir old und new verwenden, um auf die Werte einer Spalte, den Wert vor der Aktualisierung und den neuen Wert, der zugewiesen werden soll, zu verweisen.

Beispiel:

IF NOT (new.phone <=> old.phone) THEN 
    -- value assigned to phone column changed 
    ELSE 
    -- value of phone column unchanged 
    END IF; 

Die <=> (Raumschiff-Operator) ist ein NULL-safe-Vergleich, der auch WAHR oder FALSCH zurückgibt, wenn NULL-Werte verglichen werden.

+0

Scheint korrekt .. danke .. upvote – stack

+0

Ein kleines Problem, '<=>' bedeutet * nicht gleich *. Also, was ist das NICHT? Ich denke du musst sagen: * Wenn alt und der erste Wert von 'phone' Spalte nicht gleich sind dann" phone changed ". * Also glaube ich, dass du das' NOT' entfernen musst. – stack

+0

@stack: ** '<=>' ** bedeutet ... "NULL-safe equal. Dieser Operator führt einen Gleichheitsvergleich wie der Operator = durch, gibt aber 1 statt NULL zurück, wenn beide Operanden NULL sind, und 0 statt NULL if ein Operand ist NULL. " Referenz: [http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to](http://dev.mysql.com/doc/refman/5.7/en/ Vergleichsoperatoren.html # operator_equal-to) – spencer7593

Verwandte Themen