首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可能防止插入而不回滚?

问是否有可能防止插入而不回滚?
EN

Database Administration用户
提问于 2018-02-28 09:48:36
回答 2查看 744关注 0票数 2

在MySQL 5.5中,我知道我可以通过使用SIGNAL来防止插入,后者回滚我的INSERT的当前事务。

事实上,我想使用触发器在另一个表中插入一行,但是我想用它来替换原来的插入。如果在触发器中使用SIGNAL,那么新的insert语句也会被取消。

示例:

如果我做了

代码语言:javascript
复制
INSERT INTO table_a VALUES('a','b');

我希望在table_b中有一个新行,但是在table_a中没有一个行。

(我只想在几种情况下替换原来的插入。)

在MySQL中有可能吗?如果是的话,我该怎么做?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2018-02-28 15:55:39

我不容易提供确切的细节,但我相信还有两种可能的方法:

  1. 在table_a上使用黑洞引擎
  2. 使用proxysql

使用黑洞引擎的

这似乎是最简单的解决办法。

黑洞存储引擎充当一个“黑洞”,它接受数据,但将其丢弃,而不存储数据。

有关更多详细信息,请参阅MySQL 5.5doc。

首先,如果您需要保留table_a,您需要用黑洞引擎创建它的副本;

代码语言:javascript
复制
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。

票数 2
EN

Database Administration用户

发布于 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。你得用这个做实验,看看。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/199012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档