【问题标题】:how to ddl a table with an identity column如何对带有标识列的表进行 ddl
【发布时间】:2023-04-08 05:00:01
【问题描述】:

我正在尝试使用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. JOOQblog 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来生成SQL?
  • 我尝试使用 SQL99,它已被弃用并使用 DEFAULT。但显然,因为这些东西是特定于数据库的,如 [1] 中所写......这将导致我得到什么。 感谢指点我这个。使用 H2 或 MySql 可以得到我预期的结果!

标签: java identity ddl jooq


【解决方案1】:

我的错误是使用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 指出我的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2011-02-21
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    相关资源
    最近更新 更多