PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Препоръчителен подход за вмъкване на много редове с Castle ActiveRecord и игнориране на всякакви дупки

Можете да направите това с един SQL израз:

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 връща реда само ако вече не съществува, така че ще бъде вмъкнат само в този случай.

Решение за групови вмъквания

Ако имате дълъг списък с рецепти, които да вмъкнете наведнъж, можете да:

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;

Решение за вмъкване на шепа наведнъж

Временната таблица би била излишна само за няколко записа, както Майк коментира.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създайте два масива за две полета, като поддържате реда на сортиране на масивите в синхрон (без подзаявка)

  2. Heroku Postgres Грешка:PGError:ГРЕШКА:релационни организации не съществуват (ActiveRecord::StatementInvalid)

  3. създайте таблица в postgreSQL

  4. Как да оптимизирам заявката postgres

  5. Актуализация на Postgres от ляво присъединяване