添加正确的MySQL触发器

时间:2018-09-27 09:15:54

标签: mysql sql database triggers

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:0)

  • 您正在使用会话变量@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 ;

答案 1 :(得分:0)

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

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 ;