MySQL 觸發器是一種特殊的存儲過程,可以跨多個表執行某些操作。在使用觸發器時,會遇到一種情況,即當觸發器添加在某個表上時,如果原表執行插入操作,則觸發器中不再插入新數據。這是因為原表的插入操作觸發了觸發器,而該觸發器中又執行了插入操作,導致數據重復。
DELIMITER $$ CREATE TRIGGER trigger_name AFTER INSERT ON table_name FOR EACH ROW BEGIN IF NEW.column_name = 'some value' THEN INSERT INTO other_table (column1, column2) VALUES (NEW.column1, NEW.column2); END IF; END $$ DELIMITER ;
上述代碼是一個典型的 MySQL 觸發器,通過判斷原表某個字段的值是否為特定值,如果是,則在另一張表中插入對應的數據。但是,如果在該表插入新數據時觸發該觸發器,就會出現問題。因為插入新數據會觸發該觸發器,而觸發器中又會執行插入操作,導致數據重復。
為了避免出現這種情況,可以在觸發器中增加判斷條件,只有在特定條件下才執行插入操作:
DELIMITER $$ CREATE TRIGGER trigger_name AFTER INSERT ON table_name FOR EACH ROW BEGIN IF NEW.column_name = 'some value' AND NOT EXISTS (SELECT * FROM other_table WHERE column1 = NEW.column1 AND column2 = NEW.column2) THEN INSERT INTO other_table (column1, column2) VALUES (NEW.column1, NEW.column2); END IF; END $$ DELIMITER ;
上述代碼在觸發器中增加了 NOT EXISTS 子句,用于判斷是否已經有對應數據在另一張表中。如果該子查詢檢索到了已存在的數據,則觸發器不再執行插入操作,避免了數據重復。