PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann ich diese Einschränkung definieren?

Lösung für Ihre Frage

Angenommen, Sie möchten das durchsetzen:

  1. "Id_Lot" existiert tatsächlich in "Lot"."Code" . -> FK-Einschränkung
  2. "Lot"."Empty" für den Spot ist TRUE nur zum Zeitpunkt der Überprüfung.

Sie könnten tun Sie dies mit einem NOT VALID CHECK Einschränkung mit einem gefälschten IMMUTABLE Funktion, um die andere Tabelle zu überprüfen. Einzelheiten:

Aber Ihr Datenmodell ist in einigen Aspekten wackelig. Ich würde einen viel saubereren Ansatz vorschlagen.

Saubereres Design mit Ausschlussbeschränkung

Speichern Sie nicht redundant mit, ob ein Grundstück gerade leer ist. Das ist sehr fehleranfällig und anfällig für Parallelitätsprobleme. Erzwingen Sie, dass jedes Los nur einmal gleichzeitig mit einem Ausschlussbeschränkung . Damit das funktioniert, speichere den Zeitpunkt der Ausfahrt in ticket , zusätzlich.

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

Kein redundanter aktueller Zustand im lot Tabelle.

Damit die Ausschlussbeschränkung funktioniert, benötigen Sie das zusätzliche Modul btree_gist . Detaillierte Anleitung:

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))
);
  • Verwenden Sie einen Zeitstempelbereichsdatentyp tsrange für die Parkdauer during .Eingabe mit oberer Grenze NULL, wenn das Auto einfährt. Aktualisierung mit Obergrenze bei Ausfahrt des Autos. Dies ermöglicht unter anderem auch das Parken von Autos über mehrere Tage.

  • Einige zusätzliche CHECK Einschränkungen, um grundlegende Regeln für during durchzusetzen :

Verwandte: