Solução para o que você pede
Supondo que você queira impor isso:
"Id_Lot"
realmente existe em"Lot"."Code"
. -> Restrição FK"Lot"."Empty"
para o local éTRUE
apenas no momento da verificação.
Você poderia faça isso com um
NOT VALID
CHECK
restrição usando um falso IMMUTABLE
função para verificar na outra tabela. Detalhes:Mas seu modelo de dados é instável em vários aspectos. Eu sugeriria uma abordagem muito mais limpa.
Design mais limpo com restrição de exclusão
Não armazene se um lote está vazio no momento de forma redundante com o lote. Isso é muito propenso a erros e suscetível a problemas de simultaneidade. Reforce que cada lote só pode ser retirado uma vez por vez com um restrição de exclusão . Para que isso funcione, economize o tempo de saída em
ticket
, Além disso. CREATE TABLE lot (
lot_id varchar(4) NOT NULL PRIMARY KEY -- I would use integer if possible
, lot_type text NOT NULL
);
Nenhum estado atual redundante no
lot
tabela. Para que a restrição de exclusão funcione, você precisa do módulo adicional btree_gist . Instruções detalhadas:
- problema de integridade de relação 'um para muitos' para intervalos de tempo
- Armazene o dia da semana e horário?
CREATE TABLE ticket (
ticket_id serial PRIMARY KEY
, during tsrange NOT NULL
, license_plate text NOT NULL REFERENCES "Vehicle"("L_Plate"),
, lot_id int NOT NULL REFERENCES lot
, CONSTRAINT lot_uni_ticket EXCLUDE USING gist (lot_id WITH =, during WITH &&)
, CONSTRAINT during_lower_bound_not_null CHECK (NOT lower_inf(during))
, CONSTRAINT during_bounds CHECK (lower_inc(during) AND NOT upper_inc(during))
);
-
Usando um tipo de dados de intervalo de carimbo de data/horatsrange
para a duração do estacionamentoduring
.Entrar com limite superior NULL, quando o carro entrar. Atualize com o limite superior quando o carro sair. Entre outras coisas, isso também possibilita que os carros estacionem vários dias.
-
AlgunsCHECK
adicionais restrições para impor regras básicas emduring
:
- Limite inferior inclusivo, limite superior exclusivo para manter a consistência.
- O limite inferior (entrada) nunca pode faltar.
Relacionado: