sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur kan jag definiera denna begränsning?

Lösning för det du frågar

Förutsatt att du vill genomdriva det:

  1. "Id_Lot" finns faktiskt i "Lot"."Code" . -> FK-begränsning
  2. "Lot"."Empty" för platsen är TRUE endast vid tidpunkten för kontrollen.

Du kunde gör detta med en NOT VALID CHECK begränsning som använder en falsk IMMUTABLE funktion för att kontrollera på den andra tabellen. Detaljer:

Men din datamodell är skakig i ett antal aspekter. Jag skulle föreslå ett mycket renare tillvägagångssätt.

Renare design med uteslutningsbegränsning

Lagra inte om en del för närvarande är tom överflödig med partiet. Det är mycket felbenäget och känsligt för samtidiga problem. Se till att varje lot bara kan tas en gång i taget med en uteslutningsbegränsning . För att det ska fungera, spara tiden för utträde i ticket , dessutom.

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

Inget redundant aktuellt tillstånd i lot bord.

För att undantagsbegränsningen ska fungera behöver du tilläggsmodulen btree_gist . Detaljerade 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))
);
  • Använda en datatyp för tidsstämpelintervall tsrange för parkeringstiden during .Ange med övre gränsen NULL, när bilen kommer in. Uppdatera med övre gräns när bilen går ut. Detta gör det bland annat också möjligt för bilar att parkera flera dagar.

  • Några ytterligare CHECK begränsningar för att tillämpa grundläggande regler på during :

Relaterat:




  1. Migrera från AnswerHub till WordPress :A Tale of 10 Technologies

  2. Fråga MSQL för vinnare, börja på xth plats med SELECT

  3. Är mysql_insert_id-tråden säker?

  4. PHP Oracle-fråga välj uttalande inuti loop långsam