【问题标题】:How to create a valid SQL trigger with condition?如何使用条件创建有效的 SQL 触发器?
【发布时间】:2021-12-16 03:56:47
【问题描述】:

我坚持创建 SQL 触发器,当当前行的 Published 字段变为 true 时更新 publishingDate。我尝试了多种声明变体,但每次都出现语法错误。谷歌搜索没有给出当前案例的关键。希望,你能帮上忙。我的代码如下。我使用的验证器:https://ru.rakko.tools/tools/36/

delimiter !

CREATE TRIGGER `vc`.`Articles_Updated_trigger`
BEFORE UPDATE
ON `Articles` FOR EACH ROW
BEGIN
  IF new.Published = TRUE 
    SET new.PublishingdDate = CURRENT_TIMESTAMP
  END IF;
END !

【问题讨论】:

  • 您使用的是哪个 dbms? (上面的代码是特定于产品的。)
  • 如果我没记错的话,那就是 InnoDB
  • 除了其他问题,你的底层逻辑似乎是错误的——目前你每次更新发布日期,当你更新记录并且它的发布值为真时。
  • 是的,这是下一个问题。希望验证问题得到解决后我可以修复它

标签: mysql sql triggers


【解决方案1】:

如果您想获取状态更改的所有行,则需要比较 OLD 和 NEW 以检测更改

delimiter $$

CREATE TRIGGER `vc`.`Articles_Updated_trigger`
BEFORE UPDATE
ON `Articles` FOR EACH ROW
BEGIN
  IF OLD.Published = FALSE AND NEW.Published = TRUE THEN
    SET new.PublishingdDate = CURRENT_TIMESTAMP;
  END IF;
END$$
DELIMITER ;

【讨论】:

    【解决方案2】:
    CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
    ON { table | view }   
    [ WITH <dml_trigger_option> [ ,...n ] ]  
    { FOR | AFTER | INSTEAD OF }   
    { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
    [ WITH APPEND ]  
    [ NOT FOR REPLICATION ]   
    AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }  
      
    <dml_trigger_option> ::=  
        [ ENCRYPTION ]  
        [ EXECUTE AS Clause ]  
      
    <method_specifier> ::=  
        assembly_name.class_name.method_name
    

    使用此语法创建触发器并尝试下一个方面。

    【讨论】:

    • 你引用了 SQL Server 代码,但问题是关于 MySQL 的
    猜你喜欢
    • 1970-01-01
    • 2018-07-26
    • 2015-03-01
    • 2022-07-29
    • 2023-03-26
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多