PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como posso definir essa restrição?

Solução para o que você pede


Supondo que você queira impor isso:
  1. "Id_Lot" realmente existe em "Lot"."Code" . -> Restrição FK
  2. "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:


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/hora tsrange para a duração do estacionamento during .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.

  • Alguns CHECK adicionais restrições para impor regras básicas em during :

Relacionado: