可以,postgresql的returning支持但仅限单表更新;多表需写main_table.;sql server用output inserted.或deleted.;mysql 8.0.23+和sqlite 3.35.0+部分支持,旧版需select+update两步。
PostgreSQL 的 RETURNING 能否返回所有字段?
可以,但必须显式列出字段名或用 *(仅限单表更新)。UPDATE ... RETURNING * 是最简写法,前提是没涉及 JOIN 或子查询——否则 PostgreSQL 会报错 ERROR: cannot return from a relation that is not the target of the INSERT/UPDATE/DELETE。
常见错误是以为 RETURNING * 在多表 UPDATE 中也生效,其实它只认主表。如果用了 FROM 子句关联其他表,就得手动写 RETURNING table_name.*,否则报错。
- 单表更新:直接用
RETURNING * - 带
FROM的更新(如关联查条件):必须写RETURNING main_table.* - 想返回计算字段或别名?得单独列出来,
*不包含它们
SQL Server 的 OUTPUT 怎么返回整行?
OUTPUT 不支持 *,必须明确指定列。最接近“所有字段”的写法是 OUTPUT INSERTED.* 或 OUTPUT DELETED.*,取决于你想要更新前还是更新后的值。
注意:如果表有计算列、稀疏列或托管类型(如 geography),INSERTED.* 仍会返回它们,但某些客户端驱动可能解析失败——建议在复杂表结构中优先列出关键业务字段。