错误:无法 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 因为它有挂起的触发事件
SQL ALTER TABLE ADD PRIMARY KEY 错误 1064