【问题标题】:Add the correct MySQL trigger添加正确的 MySQL 触发器
【发布时间】:2019-03-03 03:56:10
【问题描述】:

我有一个应该可以工作的触发器,但它不起作用。

BEGIN
    DECLARE `refresh` VARCHAR(256);
    SET `refresh` = concat((SELECT `refresh` FROM `mobile_app_drivers` WHERE `id` = 1), '&');
    UPDATE `mobile_app_drivers` SET `refresh` = @refresh WHERE `id` = 1;
END

执行时,单元格**refresh**仍然广播一个空字符串。

//我如何创建它

DROP TRIGGER IF EXISTS `SET_UNIQUE_KEY`;
CREATE DEFINER=`root`@`localhost` TRIGGER `SET_UNIQUE_KEY` AFTER UPDATE ON `mobile_app_orders` FOR EACH ROW
BEGIN
DECLARE `refresh` VARCHAR(256);
SET `refresh` = concat((SELECT MAX(`refresh`) FROM `mobile_app_drivers` WHERE `id` = 1), '&');
UPDATE `mobile_app_drivers` SET `refresh` = @refresh WHERE `id` = NEW.driver;
END

我需要,当更新表中的任何记录时,从表 mobile_app_drivers 中的值 refresh 添加一个新的子字符串。

谢谢!

【问题讨论】:

  • 这不是触发器的定义方式。您需要定义该触发的操作,例如:before insertafter update
  • 我更新了帖子
  • 我添加了如何创建触发器的示例
  • 你为什么用@refresh。它是会话变量,之前没有定义过。所以它只会被认为是空的。

标签: mysql sql database triggers


【解决方案1】:

为什么要使用变量?做吧:

DROP TRIGGER IF EXISTS `SET_UNIQUE_KEY`;

DELIMITER $$

CREATE DEFINER=`root`@`localhost` TRIGGER `SET_UNIQUE_KEY` AFTER UPDATE ON `mobile_app_orders`
FOR EACH ROW
BEGIN
    UPDATE mobile_app_drivers CROSS JOIN
           (SELECT MAX(refresh) as max_refresh
            FROM mobile_app_drivers
            WHERE id = 1
           ) mad1      
        SET refresh = concat(mad1.max_refresh, '&')
        WHERE id = NEW.driver;
END;
DELIMITER ;

【讨论】:

    【解决方案2】:
    • 您正在使用会话变量@refresh。但是,您还没有在任何地方定义它。所以它只会被认为是空的。
    • 我修改了您的触发器,使其更清晰、更符合逻辑。声明了一个新变量 new_refresh,我们可以在 Select 语句中使用 Into 子句设置它的值。
    • 现在,调用更新语句。
    • 另外,您需要将 Delimiter 重新定义为其他内容(例如:$$),而不是 (;)。
    • 最后,将 DELIMITER 重新定义为 ;

    您可以将您的 Create Trigger 语句修改如下:

    DELIMITER $$
    DROP TRIGGER IF EXISTS `SET_UNIQUE_KEY` $$
    CREATE DEFINER=`root`@`localhost` TRIGGER `SET_UNIQUE_KEY` AFTER UPDATE ON `mobile_app_orders` FOR EACH ROW
    BEGIN
    DECLARE new_refresh VARCHAR(256) DEFAULT '';
    
    SELECT CONCAT(MAX(`refresh`), '&') INTO `new_refresh` 
    FROM `mobile_app_drivers` 
    WHERE `id` = 1;
    
    UPDATE `mobile_app_drivers` SET `refresh` = new_refresh WHERE `id` = NEW.driver;
    END $$
    DELIMITER ;
    

    【讨论】:

      猜你喜欢
      • 2014-02-10
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多