Postgresql

如何約束一個表中的行值以匹配另一表中的行值?

  • June 13, 2022

鑑於:

CREATE TABLE operation
(
 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY;
);

CREATE TABLE listing
(
 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
 operation_id BIGINT REFERENCES operation (id)
);

CREATE TABLE listing_card
(
 id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
 listing_id BIGINT REFERENCES listing (id),
 listing_operation_id BIGINT REFERENCES operation (id),
 index SMALLINT NOT NULL,
 UNIQUE (listing_operation_id, index)
);
  • 多個列表可能引用相同的操作。

如何確保該表listing包含與’s匹配的(id, operation_id)組合?listing_card``(listing_id, listing_operation_id)

我想要一些類似的東西,FOREIGN KEY (listing_id, listing_operation_id) REFERENCES listing (id, operation_id)但我不能這樣做,因為(id, operation_id)它不是唯一的(多個列表可以引用相同的操作)。

操作由不同類型的表引用。上述模式的最終目標是確保它listing_card.index在任何列表操作中都是唯一的。單個操作可能會被 3 個不同的列表引用,但它們的卡片索引在彼此之間必須是唯一的(在整個操作中)。

我想要一些類似的東西,FOREIGN KEY (listing_id, listing_operation_id) REFERENCES listing (id, operation_id)但我不能這樣做,因為(id, operation_id)它不是唯一的(多個列表可以引用相同的操作)。

不,這是個誤會。listing.id是PK,所以(id, operation_id)保證是UNIQUE,可以按計劃進行。

在進行此操作時,請對 , 進行UNIQUE約束(operation_id, id),因為id無論如何已經通過 PK 進行了索引。看:

引用自:https://dba.stackexchange.com/questions/313258