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
.