错误:无法 ALTER TABLE,因为它在尝试删除表中的列时有挂起的触发器事件

Posted

技术标签:

【中文标题】错误:无法 ALTER TABLE,因为它在尝试删除表中的列时有挂起的触发器事件【英文标题】:ERROR: cannot ALTER TABLE because it has pending trigger events while attempting to drop a column in a table 【发布时间】:2015-07-03 11:33:14 【问题描述】:

我在我的 liquibase 变更集中写了一个 sql 标签。此 sql 代码假设在名为“Purchase”的表中进行数据迁移。所以我有以下 sql 查询:

UPDATE purchase
SET location_id = (SELECT location_id FROM shop WHERE shop.id = purchase.shop_id);

那么,

ALTER TABLE purchase DROP COLUMN shop_id;

但我在尝试执行第二个查询时遇到以下错误,该查询应该删除表 Purchase 中的列“shop_id”

ERROR: cannot ALTER TABLE  because it has pending trigger events

请问这个错误是什么时候抛出的,我该如何解决。

在我的 liquibase changee 中,我的 sql 标签写如下

<sql>
     UPDATE purchase
     SET location_id = (SELECT location_id FROM shop WHERE shop.id = purchase.shop_id);        

     ALTER TABLE purchase DROP COLUMN shop_id;
</sql

请问有人可以帮我吗?提前感谢您的帮助

【问题讨论】:

你在改变之前尝试过提交吗? @Joe Love 请问要提交的 sql 代码是什么? 在直接 SQL 中,它只是“提交”(没有引号)。你的库也可能有一个提交命令,但是直接的 SQL 应该可以工作——唯一的问题是是否使用“开始事务”开始一个新事务——我会先尝试而不这样做,但是那么你将不得不研究你的应用程序,看看你是否需要另一个事务——没有它可能会工作得很好,但如果出现故障,我不希望你得到中途提交的东西。 好的,我只使用“commit”(没有引号),它可以工作。感谢@Joe Love 的帮助 我将作为一个snwer提交。 【参考方案1】:

听起来您需要在 alter 和 update 之间提交更改。

试试这个:

UPDATE purchase
SET location_id = (SELECT location_id FROM shop WHERE shop.id = purchase.shop_id);
COMMIT;
BEGIN;
ALTER TABLE purchase DROP COLUMN shop_id;

“开始;”是可选的,但听起来您的框架正在使用事务,所以我会包含它并测试以确保更改实际上“接受”。

【讨论】:

以上是关于错误:无法 ALTER TABLE,因为它在尝试删除表中的列时有挂起的触发器事件的主要内容,如果未能解决你的问题,请参考以下文章

django.db.utils.OperationalError: cannot ALTER TABLE 因为它有挂起的触发事件

MySQL Alter table 奇怪的键错误

SQL ALTER TABLE ADD PRIMARY KEY 错误 1064

mysql对字段的操作

ALTER TABLE DROP COLUMN 失败,因为一个或多个对象访问此列

Alter Table 中的 LAG 函数产生窗口函数错误