【问题标题】:jOOQ - multi-field for insertionjOOQ - 用于插入的多字段
【发布时间】: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 AFIELD B)需要插入目标TABLE A。原因是&lt;FIELD A, FIELD B&gt;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)
  • 有趣的阅读,谢谢。

标签: java sql jooq


【解决方案1】:

我不确定这是否可以通过任何 SQL 方言首先通过INSERT .. VALUES,但您当然可以使用INSERT .. SELECT 表达这种查询:

INSERT INTO a (a, b, x, y, z)
SELECT a, b, ... other value ..., ... other value ..., ... other value ...
FROM b
WHERE ...
RETURNING *;

或者使用 jOOQ

context.insertInto(TABLE A, ... columns ...)
       .select(
           select(
               FIELD A, 
               FIELD B,
               ... other field of table A ...,
               ... other field of table A ...,
               ... other field of table A ...)
          .from(B)
          .where(...))
       )
       .returning()
       .fetch()

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2021-09-26
  • 2018-01-15
  • 2017-09-08
  • 2020-03-18
  • 2012-05-14
  • 2015-11-16
相关资源
最近更新 更多