首页/数据/SQL 速查/CTE 配合 UPDATE / DELETE / INSERT
本包目录(311 条)

CTE 配合 UPDATE / DELETE / INSERT

把筛选逻辑写成 CTE 再驱动数据变更:MySQL 允许 WITH 引导 UPDATE/DELETE;PostgreSQL 还允许在 CTE 内直接执行带 RETURNING 的数据修改。

SQL 速查数据更新于 2026-10-12

MySQL:WITH + UPDATE

MySQL:WITH + UPDATE
WITH old_orders AS (
    SELECT id FROM orders
    WHERE created_at < '2023-01-01' AND status = 0
)
UPDATE orders o
JOIN old_orders t ON t.id = o.id
SET o.status = 9;

PostgreSQL:数据修改 CTE

PostgreSQL:数据修改 CTE
WITH removed AS (
    DELETE FROM sessions
    WHERE created_at < now() - INTERVAL '30 days'
    RETURNING *
)
INSERT INTO sessions_archive
SELECT * FROM removed;
MySQLWITH 可放在 UPDATE/DELETE 之前;CTE 内部不能执行数据修改
PostgreSQLCTE 内可写数据修改语句并搭配 RETURNING
注意整个语句是一个执行单元,先小范围演练

易错点

  • MySQL 里把 DELETE 写进 CTE 主体会报语法错误,正确的是 WITH ... DELETE 引导形式
  • 数据修改 CTE 不能单独回滚某一步,出错时整个语句回滚,先用备份表小批量验证

数据来源与参考

  • MySQL 8.0 Reference Manual · WITH Clause
  • PostgreSQL Documentation · Data-Modifying Statements in WITH
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌