数据变更增量表
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
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
反馈
您对此页面有任何反馈吗? 我们很乐意倾听!