【发布时间】:2015-11-04 16:57:06
【问题描述】:
我想表达如下INSERT声明:
context.insertInto(TABLE A)
.set(<FIELD A, FIELD B>, context.select(FIELD A, FIELD B).from(B).where(...))
.set(... other field of table A ...)
.set(... other field of table A ...)
.set(... other field of table A ...)
.returning()
.fetch()
子选择返回一行,两列(FIELD A 和FIELD B)需要插入目标TABLE A。原因是<FIELD A, FIELD B> 是TABLE B 的主键。 TABLE A 指的是TABLE B(外键)。
这可能吗?
【问题讨论】:
-
有趣,这在什么数据库中是可能的?
-
好问题:)。如果您只使用 jOOQ,并且期望 jOOQ 能够翻译所有内容,则会发生这种情况。这在纯 SQL 中确实是不可能的。
-
这给了我一个很好的理由最终将这些复合主键重构为单个主键。如果我没记错的话,我可以在之后使用
DSL.field(... select ...)并将这个select field作为一个普通字段插入。这样一来,我就只有一组字段,这让代码变得更容易了。 -
“如果您只使用 jOOQ,并且希望 jOOQ 能够翻译所有内容,就会发生这种情况” 我是这么认为的 - 太强大了 :) 虽然在这种情况下,我认为转换会相当困难......是的,使用单个 PK 字段,您可以使用
INSERT .. VALUES(或 jOOQ 的等效INSERT .. SET)语法来执行此操作 - 尽管出于性能原因复合主键也很有用(见:databasesoup.com/2015/01/tag-all-things.html) -
有趣的阅读,谢谢。