数据变更增量表
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
SQL 标准规定了如何将 DML 语句转换为一个 表表达式,该表达式可用于 FROM 子句 中 SELECT 语句。 其他方言支持某种形式的 RETURNING 或 OUTPUT 子句来产生相同的行为,尽管功能较弱。
数据更改增量表有两个部分
因此,您可以表达如下查询以返回所有插入的数据(包括 DEFAULT
和 TRIGGER
生成的值)
SELECT * FROM FINAL TABLE ( INSERT INTO BOOK (ID, TITLE) VALUES (1, 'The Book') )
create.select() .from(finalTable( insertInto(BOOK) .columns(BOOK.ID, BOOK.TITLE) .values(1, "The Book") )) .fetch();
按照您的方言所实施的限制,可以进一步处理、投影等此类表的结果。
结果选项的语义是
-
OLD
: 访问行数据在被数据更改语句修改之前的状态。 这不适用于 INSERT -
NEW
: 访问行数据在被数据更改语句修改之后,但在任何AFTER TRIGGERS
被触发之前的状态。 这不适用于 DELETE -
FINAL
: 访问行数据在被数据更改语句修改之后,以及所有触发器触发之后的最终状态。 数据处于“最终”形式。 这不适用于 DELETE
方言支持
此示例使用 jOOQ
select(BOOK.ID).from(finalTable(insertInto(BOOK).columns(BOOK.ID, BOOK.TITLE).values(1, "The Book")))
翻译成以下特定方言的表达式
Aurora Postgres、CockroachDB、Postgres
WITH BOOK AS ( INSERT INTO BOOK (ID, TITLE) VALUES ( 1, 'The Book' ) RETURNING BOOK.ID, BOOK.AUTHOR_ID, BOOK.TITLE, BOOK.PUBLISHED_IN, BOOK.LANGUAGE_ID ) SELECT BOOK.ID FROM BOOK BOOK
DB2、H2
SELECT BOOK.ID FROM FINAL TABLE ( INSERT INTO BOOK (ID, TITLE) VALUES ( 1, 'The Book' ) ) BOOK
Firebird
INSERT INTO BOOK (ID, TITLE) VALUES ( 1, 'The Book' ) RETURNING BOOK.ID
MariaDB
INSERT INTO BOOK (ID, TITLE) VALUES ( 1, 'The Book' ) RETURNING ID
ASE、Access、Aurora MySQL、BigQuery、ClickHouse、Databricks、Derby、DuckDB、Exasol、HSQLDB、Hana、Informix、MemSQL、MySQL、Oracle、Redshift、SQLDataWarehouse、SQLServer、SQLite、Snowflake、Sybase、Teradata、Trino、Vertica、YugabyteDB
/* UNSUPPORTED */
使用 jOOQ 3.21 生成。早期 jOOQ 版本的支持可能有所不同。 在我们的网站上翻译您自己的 SQL
反馈
您对此页面有任何反馈吗? 我们很乐意倾听!