Kun DEFERRABLE
begrænsninger kan udskydes.
Lad mig først foreslå overlegne alternativer:
1. INSERT
i rækkefølge
Vend rækkefølgen af INSERT
om udsagn og intet skal udskydes. Det enkleste og hurtigste - hvis det overhovedet er muligt.
2. Enkelt kommando
Gør det med en enkelt kommando . Så skal der stadig ikke udskydes noget, da begrænsninger, der ikke kan udskydes, kontrolleres efter hver kommando og CTE'er anses for at være en del af en enkelt kommando:
WITH ins1 AS (
INSERT INTO b(j) VALUES(2)
)
INSERT INTO a(i) VALUES(2);
Mens du er i gang, kan du genbruge værdierne for den første INSERT
; sikrere/mere bekvemt for visse etuier eller indsatser med flere rækker:
WITH ins1 AS (
INSERT INTO b(j) VALUES(3)
RETURNING j
)
INSERT INTO a(i)
SELECT j FROM ins1;
Men jeg har brug for udskudte begrænsninger! (Virkelig?)
ALTER TABLE b ADD CONSTRAINT fkey_ij FOREIGN KEY (j)
REFERENCES a (i) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE; -- !!!
Så virker din originale kode (lidt langsommere, da udskudte begrænsninger øger omkostningerne).
db<>fiddle her
Relateret:
Mit originale svar citerede manualen :
Men det var vildledende, da det kun gælder for "henvisningshandlinger", dvs. hvad der sker ON UPDATE
eller ON DELETE
til rækker i den refererede tabel. Den foreliggende sag er ikke en af dem - som @zer0hedge påpeget
.