我有以下查询。
WITH d_rows AS (DELETE FROM t_a RETURNING * ) INSERT INTO t_b SELECT * FROM d_rows;
如果我取消这个查询(psql 中的 Ctrl+c)会发生什么?删除会运行吗?它已经运行了吗?是分批运行吗?我看到 t_b 在查询运行时正在增长。了解这一点很重要,因为这是关于大量数据的。
我有以下查询。
WITH d_rows AS (DELETE FROM t_a RETURNING * ) INSERT INTO t_b SELECT * FROM d_rows;
如果我取消这个查询(psql 中的 Ctrl+c)会发生什么?删除会运行吗?它已经运行了吗?是分批运行吗?我看到 t_b 在查询运行时正在增长。了解这一点很重要,因为这是关于大量数据的。
在这方面,CTE 与任何其他语句没有任何不同——它在事务中运行。如果没有事务已打开,则为该语句打开一个事务,并且仅在整个语句成功完成时才提交。
因此,如果您中断 CTE,所有效果都将回滚并且什么也不会发生1。如果您在它正在提交的那一刻中断它,那么它可能会提交并且全部生效,但是所有CTE 都将生效或全部不生效。单独的 CTE 子条款不能单独生效。
所以......删除可能会运行,但如果是这样,它的效果将不会被提交,并且会在查询被取消时回滚。具体如何执行并不重要。PostgreSQL 可以选择对其进行批处理、逐行执行,或者执行整个 DELETE 并将其所有结果提供给 INSERT。没关系,因为效果是一样的。
1 严格来说,可以创建大量的表膨胀,但对其他事务没有逻辑上可见的影响。