2013-04-10 49 views
0

我想行插入audit_field當舊值不等於新值。爲此,我在每個插入前添加了IF NEW.notes <> OLD.notes THEN。然而,我發現(我認爲),如果OLD值爲NULL,則不執行插入操作。我還沒有測試過相反是否爲真,並且如果OLD值是NEW和NEW值是NULL,它就不會插入,但我預計它不會。檢測,如果舊值不等於新值和舊值是NULL

如何檢測如果舊值不等於新值和舊值是NULL(或者類似地,如果新值是NULL)?

CREATE TRIGGER tg_students_upd AFTER UPDATE ON students 
FOR EACH ROW 
BEGIN 
    IF NEW.name <> OLD.name OR NEW.ssn <> OLD.ssn OR NEW.notes <> OLD.notes THEN 
     INSERT INTO audits(tableName,pk,task,dateChanged,users_id,dbUser,requesting_ip) VALUES ('students', @AID, 'u', NOW(), @users_id, USER(), @requesting_ip); 
     SET @AID=LAST_INSERT_ID(); 
     IF NEW.name <> OLD.name THEN 
      INSERT INTO audit_field(audits_id,columnName,oldValue,newValue) VALUES (@AID,'name',OLD.name,NEW.name); 
     END IF; 
     IF NEW.ssn <> OLD.ssn THEN 
      INSERT INTO audit_field(audits_id,columnName,oldValue,newValue) VALUES (@AID,'ssn',OLD.ssn,NEW.ssn); 
     END IF; 
     IF NEW.notes <> OLD.notes THEN 
      INSERT INTO audit_field(audits_id,columnName,oldValue,newValue) VALUES (@AID,'notes',OLD.notes,NEW.notes); 
     END IF; 
    END IF; 
END$$ 

回答

3

使用<=>

SELECT NOT 1 <=> 1,NOT NULL <=> NULL, NOT 1 <=> NULL, NOT 1 <=> 2, 1 <> 1, NULL <> NULL, 1 <> NULL, 1 <>2; 

+-------------+-------------------+----------------+-------------+--------+--------------+-----------+-------+ 
| NOT 1 <=> 1 | NOT NULL <=> NULL | NOT 1 <=> NULL | NOT 1 <=> 2 | 1 <> 1 | NULL <> NULL | 1 <> NULL | 1 <>2 | 
+-------------+-------------------+----------------+-------------+--------+--------------+-----------+-------+ 
|   0 |     0 |    1 |   1 |  0 | NULL   | NULL  |  1 | 
+-------------+-------------------+----------------+-------------+--------+--------------+-----------+-------+ 

PS。對不起,在發佈問題之前應該閱讀手冊,但希望它能幫助別人。