【问题标题】:Can't create a TRIGGER from within another stored routine -- What is another "stored routine"?不能从另一个存储的例程中创建触发器——什么是另一个“存储的例程”?
【发布时间】:2023-03-12 09:06:01
【问题描述】:

我正在尝试使用 PhpMyAdmin 在 MySQL 中创建触发器。

CREATE TRIGGER Update_Last_Transit_Status AFTER INSERT ON Delivery 
FOR EACH ROW
BEGIN
UPDATE Transportation SET Status="Dispatched" WHERE 
EXISTS (SELECT * FROM Transit, Route WHERE Transit.ID=Route.Transit_ID and
        Route.Delivery_ID=Delivery.ID and 
        Transit.Transportation_ID=Transportation.ID) and
        Status="In Branch"
END

上面写着:

MySQL said: #1303 - Can't create a TRIGGER from within another stored routine

我知道这个错误之前已经解决过,但这根本不是我的本意。

这里的“另一个存储例程”在哪里?

我不打算按照错误消息所说的内容。

编辑: 没有定义其他触发器。然而,有一个预定义的过程:

begin
        select user() as first_col;
        select user() as first_col, now() as second_col;
        select user() as first_col, now() as second_col, now() as third_col;
        end

我不知道它是做什么的,也不知道它为什么在那里,但它以前就在那里。

【问题讨论】:

    标签: mysql triggers phpmyadmin


    【解决方案1】:

    您在上面显示的触发器很好。

    edit: 在 phpMyAdmin 的 GUI 中创建触发器时,您只需在 Definition 窗格中输入触发器的主体,即部分BEGIN...END

    这是因为 phpMyAdmin 会尽量聪明,并根据您输入的其他元素(名称、表格、时间、事件)为您编写触发器头。

    这是在 phpMyAdmin 中定义触发器的正确​​方法:

    如果在正文中写入CREATE TRIGGER... 标头,它会混淆MySQL,因为它会看到CREATE TRIGGER... CREATE TRIGGER... BEGIN...END。这使 MySQL 认为您正在定义一个触发器,其第一条语句是 CREATE TRIGGER


    作为您最初问题的一个附带问题,我建议对触发器的主体进行一些更改:

    CREATE TRIGGER Update_Last_Transit_Status AFTER INSERT ON Delivery 
    FOR EACH ROW
    BEGIN
      UPDATE Transportation
        INNER JOIN Transit ON Transit.Transportation_ID = Transportation.ID
        INNER JOIN Route ON Transit.ID = Route.Transit_ID
      SET Transportation.Status = 'Dispatched'
      WHERE Route.Delivery_ID = NEW.ID
        AND Transportation.Status = 'In Branch';
    END
    

    变化:

    • 引用NEW.ID 而不是Delivery.ID
    • 使用 SQL-92 JOIN 语法而不是 SQL-89“逗号样式”连接。
    • 将多表 UPDATE 与连接一起使用,而不是将 EXISTS 与相关子查询一起使用。
    • 对字符串使用单引号而不是双引号。
    • 用分号结束UPDATE 语句。

    【讨论】:

    • 我不明白。如果这个触发器定义是好的,那么为什么在定义这个触发器时会引发错误?这个触发器的创建与引发的错误有什么关系? (另请参阅编辑)
    猜你喜欢
    • 2019-05-28
    • 2017-06-19
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多