适用于以下版本: Dev (3.21) | 最新版 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14

重叠的可嵌入类型

适用于 ❌ 开源版   ✅ Express 版   ✅ 专业版   ✅ 企业版

前一节 解释了可嵌入类型的一般工作原理。在某些情况下,存在可嵌入类型重叠的风险,这主要在使用嵌入式键时发生,但在其他一些情况下也会发生。

例如,当为每个这些UNIQUE约束定义一个可嵌入类型时

CREATE TABLE order_item (
  order_id BIGINT NOT NULL REFERENCES order
  product_id BIGINT NOT NULL REFERENCES product,
  item_no INT NOT NULL,
  quantity INT NOT NULL,

  -- Each order_item has a unique-per-order item_no, which acts as a sequential number
  CONSTRAINT pk_order_item PRIMARY KEY (order_id, item_no),

  -- Each product can only have one order_item
  CONSTRAINT uk_order_item UNIQUE (order_id, product_id)
);

两个UNIQUE约束重叠。如果它们由一个org.jooq.EmbeddableRecord表示,每个(例如,由于使用嵌入式键功能),那么两个可嵌入类型都会引用 ORDER_ID 列。jOOQ 将确保 ORDER_ID 列不会在 SQL 语句中生成两次,在禁止这种情况发生的地方,例如在 INSERT 语句中

INSERT INTO order_item (
  order_id,
  product_id,
  item_no,
  quantity
)
VALUES (
  12,
  15,
  1,
  10
);
create.insertInto(ORDER_ITEM)
      .columns(
        ORDER_ITEM.PK_ORDER_ITEM,
        ORDER_ITEM.UK_ORDER_ITEM,
        ORDER_ITEM.QUANTITY
      )
      .values(
        new PkOrderItemRecord(12L, 15L),
        new UkOrderItemRecord(15L, 1),
        1
      )
      .execute();

尽管值15L已被提供两次,但它在生成的 SQL 查询中仅产生一次(该值的第二个副本将被忽略)。

反馈

您对此页面有任何反馈吗?我们很乐意听到您的声音!

The jOOQ Logo