Dado:
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)
);
- Várias listagens podem fazer referência à mesma operação.
Como posso garantir que a tabela listing
contenha uma (id, operation_id)
combinação que corresponda listing_card
à de (listing_id, listing_operation_id)
?
Eu quero algo na linha de, FOREIGN KEY (listing_id, listing_operation_id) REFERENCES listing (id, operation_id)
mas não posso fazer isso porque (id, operation_id)
não é exclusivo (várias listagens podem fazer referência à mesma operação).
As operações são referenciadas por diferentes tipos de tabelas. O objetivo final do esquema acima é garantir que listing_card.index
seja exclusivo em todas as operações de listagem. Uma única operação pode ser referenciada por 3 listagens diferentes, mas seus índices de cartão devem ser únicos entre si (em toda a operação).
Não, isso é um mal-entendido.
listing.id
é o PK, então(id, operation_id)
é garantido que sejaUNIQUE
, e você pode prosseguir conforme o planejado.Enquanto estiver nisso, faça essa
UNIQUE
restrição em(operation_id, id)
, poisid
já está indexado via PK de qualquer maneira. Ver: