PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Pendekatan yang disarankan untuk menyisipkan banyak baris dengan Castle ActiveRecord dan mengabaikan penipuan apa pun

Anda dapat melakukannya dengan satu pernyataan 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 hanya mengembalikan baris jika belum ada, sehingga hanya akan dimasukkan dalam kasus ini.

Solusi untuk penyisipan massal

Jika Anda memiliki daftar resep yang panjang untuk dimasukkan sekaligus, Anda dapat:

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;

Solusi untuk memasukkan segenggam sekaligus

Tabel sementara akan berlebihan hanya untuk beberapa catatan, seperti yang dikomentari Mike.

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. Anda perlu menginstal postgresql-server-dev-X.Y untuk membangun ekstensi sisi server atau libpq-dev untuk membangun aplikasi sisi klien

  2. uWSGI, Flask, sqlalchemy, dan postgres:Kesalahan SSL:dekripsi gagal atau catatan buruk mac

  3. Lompat celah SQL pada kondisi tertentu &penggunaan lead() yang tepat

  4. Postgres - Berfungsi untuk mengembalikan persimpangan 2 ARRAY?

  5. Memahami Kinerja Kueri PostgreSQL