在MySQL中特定列更新后触发触发器

44
在MySQL中,我想在特定列进行更新后触发一个触发器。我知道如何在Oracle和DB2中实现这个功能。
CREATE  TRIGGER  myTrigger
AFTER UPDATE of myColumn1,myColumn2 ... ON myTable
FOR EACH ROW
BEGIN
....
END

如何使用MySQL完成这个任务?

3个回答

73

在SQL中,您无法针对特定列更新进行触发。它适用于行。

您可以在触发器中使用IF语句来设置列的条件,如下所示:

DELIMITER //
CREATE TRIGGER myTrigger AFTER UPDATE ON myTable
FOR EACH ROW
BEGIN
   IF !(NEW.column1 <=> OLD.column1) THEN
      --type your statements here
   END IF;
END;//
DELIMITER ;

13
值得一提的是,<> 无法与 NULL 一起使用。你应该使用空安全的等价运算符 <=> 或者另外检查是否为 NULL - peterm
使用 <=> 对我造成了问题,如果 NEW.column1 = OLD.column1,则它仍会触发 if 子句中编写的语句。 - RN Kushwaha
5
根据MySQL文档,没有!<=>运算符,因此您可以使用!(NEW.columnName <=> OLD.columnName)来确定新值是否与旧值不同。 - Nebster

7
您不能仅指定在特定列更改时触发。但对于表中的记录更改,您可以执行以下操作:
delimiter |
CREATE  TRIGGER  myTrigger AFTER UPDATE ON myTable
FOR EACH ROW
BEGIN
   ...
END
|
delimiter ;

在您的触发器中,您可以像这样引用列的旧值和新值。
if NEW.column1 <> OLD.column1 ...

6
作为解决方案,我这样做了:
CREATE  TRIGGER  myTrigger
AFTER UPDATE  ON myTable
FOR EACH ROW
BEGIN
IF NEW.myColumn1 <> OLD.myColumn1 || NEW.myColumn2 <> OLD.myColumn2
then

.....

END IF
END

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接