gpt4 book ai didi

java - 如何以通用方式获取新记录的 ID? (带有 Postgres 的 JOOQ 3.4)

转载 作者:行者123 更新时间:2023-11-29 13:30:05 25 4
gpt4 key购买 nike

对于 jooq 3.4,我无法弄清楚如何做到这一点(使用 Postgresql):

Query query = dsl.insertInto(TABLE)
.set(TABLE.ID, Sequences.TABLE_ID_SEQ.nextval());

但在我不知道哪个是确切表格的情况下,像这样:

TableImpl<?> tableImpl;

Query query = dsl.insertInto(tableImpl)
.set(tableImpl.getIdentity(), tableImpl.getIdentity().getSequence().nextval());

这有可能吗?

我试过这个:

dsl.insertInto(tableImpl)
.set(DSL.field("id"),
tableImpl.getSchema().getSequence("table_id_seq").nextval())

这可行,但我仍然不知道如何从 TableImpl 对象中获取序列名称。

有解决办法吗?还是我的做法有问题?

在纯 SQL 中我会这样做:

insert into table_A (id) VALUES nextval('table_A_id_seq');
insert into table_B (table_A_id, some_val) VALUES (currval('table_A_id_seq'), some_val);

所以我需要值或对该 ID 的引用,以便以后使用为插入的记录生成的默认 ID,但我不想设置任何其他值。

最佳答案

jOOQ 目前没有任何方法可以将表与其隐式使用的标识列序列相关联。这是因为序列是在创建表时生成的,但它并没有正式连接到该表。

通常,您不必显式设置 PostgreSQL 数据库中列的 serial 值。它在插入时自动生成。就 DDL 而言,这意味着:

CREATE TABLE tablename (
colname SERIAL
);

相当于指定:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

以上内容摘自: http://www.postgresql.org/docs/9.3/static/datatype-numeric.html#DATATYPE-SERIAL

换句话说,只需从 INSERT 语句中省略 ID 值即可。

“空”INSERT 语句

请注意,如果您想创建一个“空的”INSERT 语句,即您根本不传递任何值的语句,生成一个带有已生成 ID 的新列,您可以使用 DEFAULT VALUES 子句。

使用 SQL

INSERT INTO tablename DEFAULT VALUES

使用 jOOQ

DSL.using(configuration)
.insertInto(TABLENAME)
.defaultValues()
.execute();

返回 ID

请注意,PostgreSQL 原生支持 INSERT .. RETURNING 子句,jOOQ 也支持:

使用 SQL

INSERT INTO tablename (...) VALUES (...) RETURNING ID

使用 jOOQ

DSL.using(configuration)
.insertInto(TABLENAME, ...)
.values(...)
.returning(TABLENAME.ID)
.fetchOne();

关于java - 如何以通用方式获取新记录的 ID? (带有 Postgres 的 JOOQ 3.4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25930427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com