sql >> Databáze >  >> RDS >> PostgreSQL

Jak mohu definovat toto omezení?

Řešení toho, na co se ptáte

Za předpokladu, že to chcete vynutit:

  1. "Id_Lot" skutečně existuje v "Lot"."Code" . -> Omezení FK
  2. "Lot"."Empty" pro spot je TRUE pouze v době kontroly.

Mohli byste proveďte to pomocí NOT VALID CHECK omezení pomocí falešného IMMUTABLE funkci zkontrolovat na druhém stole. Podrobnosti:

Váš datový model je však v mnoha ohledech nejistý. Navrhoval bych mnohem čistší přístup.

Čistější design s omezením vyloučení

Neukládejte, zda je šarže aktuálně prázdná, nadbytečně se šarží. To je velmi náchylné k chybám a náchylné k problémům se souběžností. Zajistěte, aby každá šarže mohla být odebrána pouze jednou pomocí omezení vyloučení . Aby to fungovalo, uložte si čas výstupu do ticket , navíc.

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

Žádný redundantní aktuální stav v lot tabulka.

Aby omezení vyloučení fungovalo, potřebujete další modul btree_gist . Podrobné pokyny:

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))
);
  • Použití datového typu rozsahu časového razítka tsrange po dobu parkování during .Zadejte s horní hranicí NULL, když auto vjede. Aktualizujte s horní hranicí, když auto vyjede. Mimo jiné to také umožňuje, aby auta parkovala několik dní.

  • Některé další CHECK omezení k vynucení základních pravidel na during :

Související:




  1. Uložit výpočet do kódu nebo databáze?

  2. CONTAINS nefunguje s Oracle Text

  3. Funkce LISTAGG:výsledek zřetězení řetězců je příliš dlouhý

  4. Vynutit Oracle vrátit TOP N řádků s SKIP LOCKED