PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Phương pháp được đề xuất để chèn nhiều hàng với Castle ActiveRecord và bỏ qua bất kỳ lỗi nào

Bạn có thể làm điều đó với một câu lệnh SQL duy nhất:

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 chỉ trả về hàng nếu nó chưa tồn tại, vì vậy nó sẽ chỉ được chèn trong trường hợp này.

Giải pháp cho chèn hàng loạt

Nếu bạn có một danh sách dài các công thức để chèn cùng một lúc, bạn có thể:

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;

Giải pháp để chèn một số ít cùng một lúc

Bảng tạm thời sẽ là quá mức cần thiết cho chỉ một vài bản ghi, như Mike đã nhận xét.

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. ngắt chuỗi row_number () dựa trên biến cờ

  2. Nhập CSV có dấu phẩy trong các giá trị chuỗi

  3. Làm thế nào để kích hoạt PostgreSQL và C # Windows Service hoạt động cùng nhau?

  4. Nhập các byte thô dưới dạng các byte thô trong R

  5. node-postgres có hỗ trợ nhiều tập kết quả không