【问题标题】:Can't Working my Before insert trigger in mysql无法在 mysql 中使用我的 Before insert 触发器
【发布时间】:2021-01-04 07:51:24
【问题描述】:

当新值插入时,我创建了一个插入前触发器,因为它的 item_sku 已经退出,然后删除已经退出的行,然后插入新行。但它显示错误: 错误代码:1442 无法更新存储函数/触发器中的表“order_item_temp”,因为它已被调用此存储函数/触发器的语句使用 触发代码是

    TRIGGER LINE_DEL AFTER INSERT ON order_item_temp 
    FOR EACH ROW 
    BEGIN
    
    DECLARE ITEM_D VARCHAR(50);

     SELECT item_sku INTO @ITEM_D
        FROM order_item_temp
         GROUP BY  item_sku,shopify_order_id
        HAVING  COUNT(item_sku) > 1;

     DELETE FROM order_item_temp WHERE item_sku=@item_d;
     
    END;
$$

DELIMITER ;

手动输入新的重复行语法是:

插入到 ehad_db.order_item_temp ( ID, item_sku, item_uid, item_sid, 项目数量, document_item_sid, document_item_row_version, ref_order_item_sid, ref_order_item_row_version, item_discount_amt, item_discount_code, item_discount_type, item_discount_target, shopify_order_id, order_document_sid, ref_order_sid ) 价值观 ( '89', '1000000009574', '517662213000115019', '32000000306430', '1', '582945547000174220', '1', '', '', '0', '', ' ', ' ', '1903931129956', '582945544000151211', ' ');

现在它显示上述错误。

【问题讨论】:

  • 用户定义的变量不是一回事,不能与声明的变量 stackoverflow.com/questions/11754781/… 互换,您不能将结果集存储在变量中,我希望看到对 NEW 的引用。插入后触发器中的值,并且您无法操作在触发器中触发触发器的表。(如错误所述)。
  • 考虑插入..on..重复键或替换
  • 在这种幼稚的情况下,它可能会起作用,但除现有逻辑之外的任何逻辑都会失败。

标签: mysql sql


【解决方案1】:

您似乎无法从触发器中的 order_item_temp 中删除行。根据documentation

存储的函数或触发器不能修改已经存在的表 被调用 函数或触发器。

相反,您应该在代码中使用这样的事务处理它

start_transaction();
delete_existed_rows();
insert_new_row();
commit();

或者您可以创建一个存储过程,删除已经退出的行并插入新行,所有这些都在一个事务中。

这是一个创建存储过程的示例代码

CREATE PROCEDURE insert_new_row(...)
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SIGNAL SQLSTATE 'ERROR'
        SET MESSAGE_TEXT = 'INSERT FAILED';
    END;

    START TRANSACTION;
    DECLARE ITEM_D VARCHAR(50);

    SELECT item_sku INTO @ITEM_D
    FROM order_item_temp
    GROUP BY  item_sku,shopify_order_id
    HAVING  COUNT(item_sku) > 1
    FOR UPDATE;

    DELETE FROM order_item_temp WHERE item_sku=@item_d;

    INSERT INTO order_item_temp (...) VALUE (...);
    COMMIT;
END;

【讨论】:

  • 你是对的......这就是我想说的。
【解决方案2】:

您不能在order_item_temp 上放置一个触发器,该触发器将从同一个表order_item_temp 中进行SELECT/DELETE。触发器不能用于更新/删除触发它们的表。触发器只能用于更新其他表,而不是触发操作的表。

您尝试执行的操作需要用您的编码语言编写,因此在您获得插入的肯定结果后,您可以运行删除 SQL。

【讨论】:

    猜你喜欢
    • 2021-11-23
    • 2014-05-08
    • 1970-01-01
    • 2014-05-27
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多