可用版本: Dev (3.21) | 最新版 (3.20) | 3.19 | 3.18 | 3.17 | 3.16

数据变更增量表

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

SQL 标准规定了如何将 DML 语句转换为一个 表表达式,该表达式可用于 FROM 子句SELECT 语句。 其他方言支持某种形式的 RETURNING 或 OUTPUT 子句来产生相同的行为,尽管功能较弱。

数据更改增量表有两个部分

因此,您可以表达如下查询以返回所有插入的数据(包括 DEFAULTTRIGGER 生成的值)

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

反馈

您对此页面有任何反馈吗? 我们很乐意倾听!

The jOOQ Logo