如何使用标识列对 table 进行 ddl

how to ddl a table with an identity column

我正在尝试使用 JOOQ 创建一个数据库 table,其中包含一个 id,应该是 identity

例如我的SQL是由JOOQ生成的

create table "help"(
  "id" integer not null,
  "guid" varchar(36) not null,
  "category" nvarchar(255) null,
  "value" nvarchar(2048) null,
  constraint "PK_HELP_ID"
    primary key ("id"),
  constraint "UK_HELP_GUID"
    unique ("guid")
)

JOOQ 等价于:

Name nameId = DSL.name("id");
Name nameGuid = DSL.name("guid");
Name nameCategory = DSL.name("category");
Name nameValue = DSL.name("value");
CreateTableConstraintStep table = create.createTable("help")//
        .column(nameId, SQLDataType.INTEGER.identity(true))//
        .column(nameGuid, SQLDataType.VARCHAR(36).nullable(false))//
        .column(nameCategory, SQLDataType.NVARCHAR(255))//
        .column(nameValue, SQLDataType.NVARCHAR(2048))//
        .constraints(//
                DSL.constraint("PK_HELP_ID").primaryKey(nameId),
                DSL.constraint("UK_HELP_GUID").unique(nameGuid));

我认为 SQLDataType.INTEGER.identity(true) 完全符合我的要求,但结果却有所不同。

我的调查只带来了这些结果:

  1. 博客 post JOOQ 博客 identity columns - Subtle SQL differences: IDENTITY columns

  2. 还有一期 github Add support for IDENTITY columns in CREATE TABLE statements #5062

如何使用 JOOQDDL 声明一个列为 identity JOOQ 版本 3.10.5

我的错误是使用了 SQLDialect.SQL99SQLDialect.DEFAULT

注意:SQLDialect.SQL99 已弃用。

显然,由于身份是特定于数据库的,正如您在参考 1 中从我的问题中指出的那样,这将导致我得到的结果。 (因为 DEFAULT SQL.

没有身份可用
DSLContext ctx = DSL.using(con, SQLDialect.DEFAULT);

如果我用 SQLDialect.H2 配置我的 DSLContext 或者例如 SQLDialect.MYSQL JOOQ 生成正确的输出。

DSLContext ctx = DSL.using(con, SQLDialect.H2);

感谢Lukas Eder指出我的错误