sql >> Database >  >> RDS >> PostgreSQL

Hoe kan ik deze beperking definiëren?

Oplossing voor wat je vraagt

Ervan uitgaande dat u dat wilt afdwingen:

  1. "Id_Lot" bestaat daadwerkelijk in "Lot"."Code" . -> FK-beperking
  2. "Lot"."Empty" voor de plek is TRUE alleen op het moment van de controle.

Je zou doe dit met een NOT VALID CHECK beperking met behulp van een nep IMMUTABLE functie om op de andere tafel te controleren. Details:

Maar uw datamodel is in een aantal opzichten wankel. Ik zou een veel schonere aanpak willen voorstellen.

Schoner ontwerp met uitsluitingsbeperking

Sla niet overtollig leeg bij de kavel of een kavel op dit moment leeg staat. Dat is erg foutgevoelig en vatbaar voor gelijktijdigheidsproblemen. Dwing af dat elk lot slechts één keer tegelijk kan worden ingenomen met een uitsluitingsbeperking . Om dat te laten werken, slaat u de vertrektijd op in ticket , bovendien.

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

Geen overbodige huidige staat in de lot tafel.

Om de uitsluitingsbeperking te laten werken, hebt u de extra module btree_gist . Gedetailleerde instructies:

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))
);
  • Een gegevenstype met een tijdstempelbereik gebruiken tsrange voor de parkeerduur during .Enter met bovengrens NULL, wanneer de auto binnenkomt. Update met bovengrens bij het uitrijden van de auto. Dit maakt het onder andere ook mogelijk voor auto's om meerdere dagen te parkeren.

  • Enkele aanvullende CHECK beperkingen om basisregels af te dwingen op during :

Gerelateerd:




  1. Hoe zich te ontdoen van lege maar enorme LOB-kolom?

  2. Hoe kunt u in pg_restore een postgres-verbindingsreeks gebruiken om de host/database/gebruikersnaam/wachtwoord op te geven?

  3. Incrementele gegevensreplicatie in IRI Workbench

  4. Hoe te verhogen in SQL met behulp van een trigger?