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

Indsæt løbende alle unikke kombinationer af tre ID'er

Som @a_horse_with_no_name allerede har angivet:Funktionen unnest() udflader ikke kun den første dimension, men alle indlejrede elementer. Så det opretter en række pr. heltal. Det resulterer selvfølgelig i én kolonne med (i dit tilfælde) seks værdier. Dette er, hvad undtagelsesmeddelelsen betyder:Du genererer én kolonne, men tre var forventet.

Så du har brug for en løsning til kun at fjerne den første dimension. Jeg bruger de løsninger, der præsenteres her :

demo:db<>fiddle

Oprettelse af Lukas' funktion:

CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
  RETURNS SETOF anyarray AS
$func$
SELECT array_agg($1[d1][d2])
FROM   generate_subscripts($1,1) d1
    ,  generate_subscripts($1,2) d2
GROUP  BY d1
ORDER  BY d1
$func$  LANGUAGE sql IMMUTABLE;

Denne udløser kun den første dimension. Så du kan bruge det i stedet for dit unnest()-forsøg i din funktion:

CREATE OR REPLACE function create_combinations_if_needed(p_combinations integer[][]) RETURNS boolean
LANGUAGE sql AS
$$
   INSERT INTO combinations (some_id1, some_id2, some_id3)
   SELECT unnest[1], unnest[2], unnest[3]
   FROM unnest_2d_1d(p_combinations) as unnest
   ON CONFLICT (some_id1, some_id2, some_id3)
   DO NOTHING
   RETURNING TRUE;
$$;



  1. Underforespørgsel returnerer mere end 1 række

  2. Få rodstien til et træ med ren MySQL

  3. genindlæs siden ved hjælp af ajax for at oprette en live chat

  4. Behold specialtegn, når du importerer til mysql fra csv