sql >> Database teknologi >  >> RDS >> PostgreSQL

SÆT BEGRÆNSNINGER ALLE UDSAT virker ikke som forventet

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 .



  1. Hvordan kommer man uden om en unik overtrædelse af begrænsninger?

  2. Sådan trækkes et år fra en dato i MariaDB

  3. NULLIF() Funktion i Oracle

  4. Øger indstillingen NOT NULL på en kolonne i postgresql ydeevnen?