sql >> Database >  >> RDS >> PostgreSQL

BEPERKINGEN INSTELLEN ALLES UITGESTELD werken niet zoals verwacht

Alleen DEFERRABLE beperkingen kunnen worden uitgesteld.

Laat me eerst superieure alternatieven voorstellen:

1. INSERT in volgorde

Keer de volgorde van de INSERT om uitspraken en niets hoeft te worden uitgesteld. Eenvoudigste en snelste - indien mogelijk.

2. Enkele opdracht

Doe het in een enkele opdracht . Dan hoeft er nog steeds niets te worden uitgesteld, omdat niet-uitstelbare beperkingen na elke opdracht worden aangevinkt en CTE's worden beschouwd als onderdeel van een enkele opdracht:

WITH ins1 AS (
   INSERT INTO b(j) VALUES(2)
   )
INSERT INTO a(i) VALUES(2);

Terwijl je bezig bent, kun je de waarden voor de eerste INSERT . opnieuw gebruiken; veiliger / handiger voor bepaalde gevallen of inzetstukken met meerdere rijen:

WITH ins1 AS (
   INSERT INTO b(j) VALUES(3)
   RETURNING j
   )
INSERT INTO a(i)
SELECT j FROM ins1;

Maar ik heb uitgestelde beperkingen nodig! (Echt waar?)

ALTER TABLE b ADD CONSTRAINT fkey_ij FOREIGN KEY (j)
   REFERENCES a (i) MATCH SIMPLE
   ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE;  -- !!!

Dan werkt je originele code (een beetje langzamer, omdat uitgestelde beperkingen kosten met zich meebrengen).

db<>fiddle hier

Gerelateerd:

Mijn oorspronkelijke antwoord citeerde de handleiding :

Maar dat was misleidend omdat het alleen van toepassing is op "referentiële acties", d.w.z. wat er gebeurt ON UPDATE of ON DELETE naar rijen in de tabel waarnaar wordt verwezen. De onderhavige zaak is daar niet een van - zoals @zer0hedge opgemerkt .



  1. bereken de eindvoorraadhoeveelheid, prijs en waarde door FIFO

  2. django.db.utils.ProgrammingError:relatie bot_trade bestaat niet

  3. Laravel-relatiefout:niet-gedefinieerde eigenschap:Illuminate\Database\Eloquent\Collection::$id op regel 1

  4. Kolom wijzigen versus kolom wijzigen