PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak mogę zdefiniować to ograniczenie?

Rozwiązanie na to, o co prosisz

Zakładając, że chcesz to wymusić:

  1. "Id_Lot" faktycznie istnieje w "Lot"."Code" . -> Ograniczenie FK
  2. "Lot"."Empty" dla spotu jest TRUE tylko w momencie sprawdzania.

możesz zrób to za pomocą NOT VALID CHECK ograniczenie za pomocą fałszywego IMMUTABLE funkcja do sprawdzenia na drugim stole. Szczegóły:

Ale Twój model danych jest niepewny pod wieloma względami. Sugerowałbym znacznie czystsze podejście.

Czystszy projekt z ograniczeniem wykluczenia

Nie przechowuj, czy dana parcela jest obecnie pusta z nadmiarem. To bardzo podatne na błędy i podatne na problemy ze współbieżnością. Egzekwuj, że każda partia może być pobierana tylko raz naraz za pomocą ograniczenie wykluczenia . Aby to zadziałało, zapisz czas wyjścia w ticket , dodatkowo.

CREATE TABLE lot (
  lot_id   varchar(4) NOT NULL PRIMARY KEY  -- I would use integer if possible
, lot_type text NOT NULL
);

Brak nadmiarowego aktualnego stanu w lot tabela.

Aby ograniczenie wykluczenia działało, potrzebujesz dodatkowego modułu btree_gist . Szczegółowe instrukcje:

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))
);
  • Korzystanie z typu danych zakresu sygnatury czasowej tsrange na czas parkowania during .Wpisz z górną granicą NULL, gdy samochód wjedzie. Zaktualizuj górną granicę, gdy samochód wyjedzie.Umożliwia to między innymi parkowanie samochodów przez wiele dni.

  • Niektóre dodatkowe CHECK ograniczenia wymuszające podstawowe zasady na during :

Powiązane:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Połącz aplikację na iPhone'a z PostgreSQL za pomocą Libpq

  2. Używanie niestandardowego kodera JSON do implementacji PostgreSQL JSONB w SQLAlchemy

  3. Niezdefiniowane połączenie db z knex

  4. Sytuacja, w której ActiveRecord i SQL nie zwracają tych samych wyników, ponieważ nieznany OID jest traktowany jako String

  5. Funkcja agregująca sumy tablic parami?