【问题标题】:How to convert Oracle triggers to mysql如何将Oracle触发器转换为mysql
【发布时间】:2016-11-16 10:23:34
【问题描述】:

这是预言机触发器:

CREATE OR REPLACE TRIGGER "SW_TARIFF_TARIFF_TRIGGER" 
BEFORE INSERT OR UPDATE OF "LAST_UPDATED_DT" ON "DEMO_DB"."SOLID_WASTE_TARIFF_MASTER" 
REFERENCING OLD AS "OLD" NEW AS "NEW" 
FOR EACH ROW 
BEGIN   
    :NEW.LAST_UPDATED_DT := SYSDATE; 
END;

我想把它移到mysql。但我不知道我写了 cretae 并用一个触发器替换,并且 mysql 替换 oracle 的关键字也有问题。谁能建议我如何将此 oracle 触发器转换为 mysql 。

【问题讨论】:

    标签: mysql database oracle triggers


    【解决方案1】:

    在 MySql 中,您需要创建两个单独的触发器,第一个触发器 BEFORE INSERT 和第二个触发器 BEFORE UPDATE
    MySql 不支持此子句UPDATE OF column_name - 即仅在指定列发生更改时触发触发器。在 MySql 中,触发器总是被触发,您需要自己在 trugger 的主体中检测到这种情况。

    试试:

    CREATE TRIGGER SW_TARIFF_TARIFF_TRIGGER1 
    BEFORE INSERT ON SOLID_WASTE_TARIFF_MASTER
    FOR EACH ROW 
      SET NEW.LAST_UPDATED_DT := Now();
    

    还有这个:

    CREATE TRIGGER SW_TARIFF_TARIFF_TRIGGER2 
    BEFORE UPDATE ON SOLID_WASTE_TARIFF_MASTER
    FOR EACH ROW 
    BEGIN
       IF NEW.LAST_UPDATED_DT <> OLD.LAST_UPDATED_DT
          AND NEW.LAST_UPDATED_DT IS NOT NULL
          AND OLD.LAST_UPDATED_DT IS NOT NULL
          OR NEW.LAST_UPDATED_DT IS  NULL AND OLD.LAST_UPDATED_DT IS NOT NULL
          OR NEW.LAST_UPDATED_DT IS NOT NULL AND OLD.LAST_UPDATED_DT IS  NULL
       THEN
           SET NEW.LAST_UPDATED_DT := Now();
       END IF;
    END;
    

    这个可怕的 IF 条件检测列 LAST_UPDATED 是否已更改(它模拟来自 Oracle 的 UPDATE OF "LAST_UPDATED_DT" 子句)

    有关 MySql 中触发器的更多信息,请参阅文档: http://dev.mysql.com/doc/refman/5.7/en/create-trigger.html

    https://dev.mysql.com/doc/refman/5.5/en/trigger-syntax.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-08
      • 2020-09-13
      • 2020-07-15
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      相关资源
      最近更新 更多