sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan kan jeg definere denne begrænsning?

Løsning på det, du spørger om

Forudsat at du vil håndhæve det:

  1. "Id_Lot" eksisterer faktisk i "Lot"."Code" . -> FK-begrænsning
  2. "Lot"."Empty" for stedet er TRUE kun på tidspunktet for kontrollen.

Du kunne gør dette med en NOT VALID CHECK begrænsning ved hjælp af en falsk IMMUTABLE funktion til at kontrollere på den anden tabel. Detaljer:

Men din datamodel er rystende i en række aspekter. Jeg vil foreslå en meget renere tilgang.

Renere design med udelukkelsesbegrænsning

Gem ikke, om en vare i øjeblikket er tom redundant sammen med varen. Det er meget fejltilbøjeligt og følsomt over for samtidighedsproblemer. Håndhæv, at hvert parti kun kan tages én gang ad gangen med en ekskluderingsbegrænsning . For at det skal virke, skal du gemme tidspunktet for udgang i ticket , desuden.

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

Ingen redundant aktuel tilstand i lot tabel.

For at udelukkelsesbegrænsningen skal fungere, skal du bruge det ekstra modul btree_gist . Detaljerede instruktioner:

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))
);
  • Brug af et tidsstempelområde datatype tsrange for parkeringsvarigheden during . Indtast med øvre grænse NULL, når bilen kommer ind. Opdater med øvre grænse, når bilen kører ud. Dette gør det blandt andet også muligt for biler at parkere flere dage.

  • Nogle ekstra CHECK begrænsninger for at håndhæve grundlæggende regler på during :

Relateret:




  1. Installer psychopg2 på Ubuntu

  2. cx_Oracle 'ORA-01843:ikke en gyldig måned' med unicode-parameter

  3. Mere end én tabel fundet i navneområdet (, ) - SchemaExtractionException

  4. Sådan indsætter du tid 2009-09-22 18:09:37.881 i MYSQL Min kolonnetype er DateTime