插入到同一个表触发器mysql

插入到同一个表触发器mysql,mysql,triggers,insert,Mysql,Triggers,Insert,每次我在同一张表中插入一行时,我都需要在表中插入一行折扣。 现在我知道这可能会以一个无休止的循环结束,但我已经把支票放进去了,这样在插入折扣线时它就不会插入任何东西 Mysql似乎不允许这样做,它甚至没有插入到表中,更不用说触发了 有什么建议吗?MySQL中不允许这样做 一种解决方案是让触发器在另一个表中插入两次。然后,您将对写入表进行写入和更新,并从触发器管理的读取表进行读取。MySQL中不允许这样做 一种解决方案是让触发器在另一个表中插入两次。然后,您将对写入表进行写入和更新,并从触发器管理

每次我在同一张表中插入一行时,我都需要在表中插入一行折扣。 现在我知道这可能会以一个无休止的循环结束,但我已经把支票放进去了,这样在插入折扣线时它就不会插入任何东西

Mysql似乎不允许这样做,它甚至没有插入到表中,更不用说触发了


有什么建议吗?

MySQL中不允许这样做


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

MySQL中不允许这样做

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

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

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

如果将另一个表设为
黑洞
,则不必担心存储问题

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 ;
不能在附加到表的触发器中更改表(当前行除外)

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

如果将另一个表设为
黑洞
,则不必担心存储问题

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 ;

你为什么不把你的
INSERT
代码改成这样呢

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

另一件事是重新评估您的数据结构。从您提供的有限信息来看,现在的情况似乎不是标准化的。您正在表中存储两种类型的信息

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


或者将表拆分为两个表,一个用于“普通”项目行,另一个用于折扣项目。

为什么不将
插入的
代码更改为类似的内容呢

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

另一件事是重新评估您的数据结构。从您提供的有限信息来看,现在的情况似乎不是标准化的。您正在表中存储两种类型的信息

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


或者将表拆分为两个表,一个用于“普通”项目行,另一个用于折扣项目。

我需要根据表集合的特定条件向同一个表中添加一行,但由于稳定性锁定策略,无法更新应用程序查询以在数据库之外处理它

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

暂存台
CREATE TABLE`TABLE_staging`(
`id`INT不为空,
`值`VARCHAR(250)不为空,
`添加了'TINYINT(1)非空默认值'0',
主键(`id`)
);
触发
为每行在“表”上插入后创建触发器“表”
表触发器:开始
如果@EXIT_触发器不为空,则
/*不要执行触发器*/
离开表触发器;
如果结束;
/*如果记录不存在,请将其插入临时表*/
将IGNORE插入'table_staging'('id','value`)
值(NEW.id,“自定义值”);
终止
事件
CREATE EVENT`table\u staging\u add`
按时
每1分钟开始“2020-03-31 18:16:48”
完工后不保留
使可能
注释“”
一定要开始
/*如果事件当前正在运行,请避免执行*/
如果@EXIT_触发器为空,则
设置@EXIT_TRIGGER=TRUE;
/*添加尚未更新的值*/
插入表(`value`)
选择
ts值
从表_分段为ts
其中ts.added=0;
/*更新记录以在下一次传递时排除它们*/
将表_staging更新为ts
设置ts.added=1;
/*或者,从暂存表中删除所有记录*/
/*截断表*/
/*重置执行状态*/
设置@EXIT_TRIGGER=NULL;
如果结束;
终止
笔记 确保在MySQL配置中启用(Windows上的my.ini或Linux上的my.cnf)


我需要根据表集合上的特定条件向同一个表中添加一行,但由于稳定性锁策略,无法更新应用程序查询以在数据库之外处理它

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

暂存台
CREATE TABLE`TABLE_staging`(
`id`INT不为空,
`值`VARCHAR(250)不为空,
`添加了'TINYINT(1)非空默认值'0',
主键(`id`)
);
触发
为每行在“表”上插入后创建触发器“表”
表触发器:开始
如果@EXIT_触发器不为空,则
/*不要执行触发器*/
离开表触发器;
如果结束;
/*如果记录不存在,请将其插入临时表*/
在't'中插入IGNORE