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

时间:2018-03-07 07:40:17

标签: java identity ddl jooq

我正在尝试使用JOOQ创建一个数据库表,其中包含一个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. 关于JOOQ博客identity columns - Subtle SQL differences: IDENTITY columns

  2. 的博客文章
  3. github上有一个问题Add support for IDENTITY columns in CREATE TABLE statements #5062

  4. 如何使用identityDDL列声明为JOOQ JOOQ版本3.10.5

1 个答案:

答案 0 :(得分:0)

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

注意:不推荐使用SQLDialect.SQL99

很明显,因为身份是数据库特定的,如我在问题参考1所指出的那样,这将导致我得到的结果。 (因为没有DEFAULT SQL的身份。

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

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

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

感谢Lukas Eder指出我的错误。