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

Anbefalet tilgang til at indsætte mange rækker med Castle ActiveRecord og ignorere eventuelle duper

Du kan gøre det med en enkelt SQL-sætning:

INSERT INTO user_recipe
SELECT new_UserId, new_RecipeId
FROM   user_recipe
WHERE  NOT EXISTS (
   SELECT *
   FROM   user_recipe
   WHERE  (UserId, RecipeId) = (new_UserId, new_RecipeId)
   );

SELECT returnerer kun rækken, hvis den ikke allerede eksisterer, så den vil kun blive indsat i dette tilfælde.

Løsning til bulkskær

Hvis du har en lang liste af opskrifter, du skal indsætte på én gang, kan du:

CREATE TEMP TABLE i(userId int, recipeid int) ON COMMIT DROP;

INSERT INTO i VALUES
(1,2), (2,4), (2,4), (2,7), (2,43), (23,113), (223,133);

INSERT INTO user_recipe
SELECT DISTINCT i.*  -- remove dupes from the insert candidates themselves
FROM   i
LEFT   JOIN user_recipe u USING (userid, recipeid)
WHERE  u.userid IS NULL;

Løsning til at indsætte en håndfuld ad gangen

Midlertidig tabel ville være en overkill for blot nogle få poster, som Mike kommenterede.

INSERT INTO user_recipe
SELECT i.* 
FROM  (
    SELECT DISTINCT *     -- only if you need to remove possible dupes
    FROM (
       VALUES (1::int, 2::int)
          ,(2, 3)
          ,(2, 4)
          ,(2, 4)            -- dupe will be removed
          ,(2, 43)
          ,(23, 113)
          ,(223, 133)
       ) i(userid, recipeid)
    ) i
LEFT   JOIN user_recipe u USING (userid, recipeid)
WHERE  u.userid IS NULL;



  1. mysql sletning, autoincrement

  2. Annoncering af ClusterControl 1.7.2:Forbedret PostgreSQL backup og support til TimescaleDB &MySQL 8.0

  3. Maksimal udførelsestid i phpMyadmin

  4. Postgresql:Gruppering med begrænsning på gruppestørrelse ved hjælp af vinduesfunktioner