在MySQL 5.5中,我知道我可以通过使用SIGNAL来防止插入,后者回滚我的INSERT的当前事务。
事实上,我想使用触发器在另一个表中插入一行,但是我想用它来替换原来的插入。如果在触发器中使用SIGNAL,那么新的insert语句也会被取消。
示例:
如果我做了
INSERT INTO table_a VALUES('a','b');我希望在table_b中有一个新行,但是在table_a中没有一个行。
(我只想在几种情况下替换原来的插入。)
在MySQL中有可能吗?如果是的话,我该怎么做?
发布于 2018-02-28 15:55:39
我不容易提供确切的细节,但我相信还有两种可能的方法:
使用黑洞引擎的
这似乎是最简单的解决办法。
黑洞存储引擎充当一个“黑洞”,它接受数据,但将其丢弃,而不存储数据。
有关更多详细信息,请参阅MySQL 5.5doc。
首先,如果您需要保留table_a,您需要用黑洞引擎创建它的副本;
CREATE TABLE table_a(
id INT unsigned auto_increment primary key,
field CHAR(5)
)Engine=InnoDB;
CREATE TABLE table_blackhole(
id INT unsigned auto_increment primary key,
field CHAR(5)
)Engine=BLACKHOLE;然后,在table_blackhole上创建触发器。
在扳机里,用
INSERT on table_a (例如)用于正常治疗(我们不阻止插入)INSERTon table_b (我们“防止”正常插入,但没有回滚)。不要在table_a中插入行,而是在table_blackhole上执行INSERT。
发布于 2018-02-28 13:49:43
回到Apr 25, 2011,我回复了在MySQL中触发以防止插入的帖子
我从书的第11章第254-256页学到了使存储过程在没有信号的情况下中止的技术。

在子标题“使用触发器验证数据”下
注意这本书(发行的April 4, 2006)是怎么说SIGNAL的
本书建议以这种方式抢占触发器的原因是,MySQL存储过程语言没有将信号实现到语言中(当然,信号是ANSI标准)。本书的作者通过调用语法正确但在运行时失败的SQL语句来创建工作。本书第144-145页(第6章:错误处理)给出了以下示例:直接抢占存储过程(示例6-18)或信号模拟(示例6-19和6-20)。
如何这样做的一个例子是在检查约束不起作用? (Dec 23, 2011)中。
我也在我的帖子在MySQL中插入触发器之前 (Jun 09, 2013)中解释了这一点。
在特定情况下,需要将新行添加到table_b,然后中止存储过程。我不能保证回滚不会发生,但至少不应该发生SIGNAL。你得用这个做实验,看看。
https://dba.stackexchange.com/questions/199012
复制相似问题