如何使用标识列对 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)
完全符合我的要求,但结果却有所不同。
我的调查只带来了这些结果:
博客 post JOOQ
博客 identity columns - Subtle SQL differences: IDENTITY columns
还有一期 github Add support for IDENTITY columns in CREATE TABLE statements #5062
如何使用 JOOQ
为 DDL
声明一个列为 identity
?
JOOQ 版本 3.10.5
我的错误是使用了 SQLDialect.SQL99
和 SQLDialect.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指出我的错误
我正在尝试使用 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)
完全符合我的要求,但结果却有所不同。
我的调查只带来了这些结果:
博客 post
JOOQ
博客 identity columns - Subtle SQL differences: IDENTITY columns还有一期 github Add support for IDENTITY columns in CREATE TABLE statements #5062
如何使用 JOOQ
为 DDL
声明一个列为 identity
?
JOOQ 版本 3.10.5
我的错误是使用了 SQLDialect.SQL99
和 SQLDialect.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指出我的错误