【问题标题】:Unable to insert into table after creating an After insert trigger创建后插入触发器后无法插入表
【发布时间】:2015-12-01 22:58:04
【问题描述】:

我有两张桌子 表一:default_sellers_commissions有:

id
value - INT

表二:marketplace_saleperpartner有:

id
userID
commission - INT default '0.00'
commission_id

我需要的是在表marketplace_saleperpartner 中插入新行后,使用default_sellers_commissions.value 中的值更新marketplace_saleperpartner.commission 值,其中marketplace_saleperpartner.commission_id = default_sellers_commissions.id

所以我创建了一个触发器:

CREATE TRIGGER `marketplacedefaultcommission`
AFTER INSERT ON `marketplace_saleperpartner`
FOR EACH ROW
UPDATE marketplace_saleperpartner
    SET `marketplace_saleperpartner`.`commision` = `default_sellers_commissions`.`value`
    WHERE `marketplace_saleperpartner`.`comm_id` = `default_sellers_commissions`.`id`
    AND `marketplace_saleperpartner`.`commision`='0.00';

附注:
出于某种原因,我需要 marketplace_saleperpartner.commision 第一次插入 value='0.00'

现在我在尝试向表 marketplace_saleperpartner 插入新行时遇到此错误

MySql Error: Can't update table in stored function/trigger because it is already used by statement which invoked this stored function/trigger

有什么帮助吗?

【问题讨论】:

  • 插入语句是什么样的?您不能修改AFTER 触发器中的任何表行值。如果您确实需要创建佣金值为 0 的行,那么您需要执行 2 次插入,因为您无法使用触发器在同一个表中插入行。您可以将佣金值设置为不同表格中的值。这就是你想要做的吗?
  • @JRD 是的,这就是我需要的,将佣金值设置为不同表中的值。

标签: mysql triggers


【解决方案1】:

您可以使用BEFORE INSERT 触发器,将marketplace_saleperpartner.commisionmarketplace_saleperpartner 设置为value

CREATE TRIGGER marketplacedefaultcommission
BEFORE INSERT ON marketplace_saleperpartner
FOR EACH ROW
BEGIN
    SET new.commission = (
        SELECT value
        FROM   default_sellers_commissions
        WHERE  id = new.commission_id
    );
END;

SQL Fiddle 示例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    相关资源
    最近更新 更多