插入同一个表中触发mysql

时间:2011-12-14 13:00:05

标签: mysql triggers insert

我需要在表格中插入折扣行的所有时间。 现在我知道这可能会以无限循环结束,但我已将支票放入,因此在插入折扣行时不会插入任何内容。

Mysql似乎不允许这样做。它甚至不会插入表中,更不用说触发触发器了

有关如何执行此操作的任何建议吗?

4 个答案:

答案 0 :(得分:4)

您无法更改附加到该表的触发器中的表(当前行除外)。

一种解决方案是插入另一个表并使该触发器在您感兴趣的表中插入2行。

如果您将另一张表格设为blackhole,则无需担心存储空间。

DELIMITER $$

CREATE TRIGGER ai_bh_test_each AFTER INSERT ON bh_test FOR EACH ROW
BEGIN
  INSERT INTO table1 (field1, field2, ...) VALUES (new.field1, new.field2, ....);
  INSERT INTO table1 ... values for the second row
END $$

DELIMITER ;

答案 1 :(得分:2)

MySQL不允许这样做。

一种解决方案是让触发器插入另一个表两次。然后,您将对写表进行写入和更新,并从触发器管理的读表中读取。

答案 2 :(得分:2)

为什么不直接将INSERT代码更改为此类代码? :

INSERT INTO table1 (field1, field2, ...) 
VALUES ( @item, @price, ....)
     , ( @item, @discount, ...) ;

另一件事是重新评估您的数据结构。现在的方式,似乎 - 从您提供的有限信息 - 它没有正常化。您在表中存储了两种类型的信息。

也许你可以通过在表格中添加几列来将两行(每次都要插入)合并为一行。

或者将表分成两个表,一个用于"正常"项目行和一个折扣项目。

答案 3 :(得分:0)

我需要根据表汇总上的特定条件在同一表中添加一行,并且由于稳定性锁定策略而无法更新我的应用程序查询以在数据库之外处理该查询。

另一种解决方案是在MySQL中利用Events来读取保存暂挂更改的“ staging” 表。这通过消除由触发器引起的循环引用而起作用。然后,事件通过使用会话变量使触发器提早离开而执行所需的更改,而无需启动触发器。请根据您的需要修改事件的时间,例如EVERY 5 SECOND

登台表

CREATE TABLE `table_staging` (
   `id` INT NOT NULL,
   `value` VARCHAR(250) NOT NULL,
   `added` TINYINT(1) NOT NULL DEFAULT '0',
   PRIMARY KEY (`id`)
);

触发

CREATE TRIGGER `table_after_insert` AFTER INSERT ON `table` FOR EACH ROW 
tableTrigger: BEGIN

    IF @EXIT_TRIGGER IS NOT NULL THEN
        /* do not execute the trigger */
        LEAVE tableTrigger;
    END IF;

    /* insert the record into staging table if it does not already exist */
    INSERT IGNORE INTO `table_staging`(`id`, `value`)
    VALUES (NEW.id, 'custom value');

END;

事件

CREATE EVENT `table_staging_add`
    ON SCHEDULE
        EVERY 1 MINUTE STARTS '2020-03-31 18:16:48'
    ON COMPLETION NOT PRESERVE
    ENABLE
    COMMENT ''
    DO BEGIN

    /* avoid executing if the event is currently running */
    IF @EXIT_TRIGGER IS NULL THEN

        SET @EXIT_TRIGGER=TRUE;

        /* add the values that have not already been updated */
        INSERT INTO table(`value`)
        SELECT 
            ts.value
        FROM table_staging AS ts
        WHERE ts.added = 0;

        /* update the records to exclude them on the next pass */
        UPDATE table_staging AS ts
        SET ts.added = 1;

        /* alternatively remove all the records from the staging table */
        /* TRUNCATE table_staging; */

        /* reset the state of execution */
        SET @EXIT_TRIGGER=NULL;

    END IF;
END;

注释

请确保在您的MySQL配置(Windows上的my.ini或Linux上的my.cnf)中启用event scheduler

[mysqld]
event_scheduler = ON
相关问题