Postgresql
如何約束一個表中的行值以匹配另一表中的行值?
鑑於:
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 進行了索引。看: