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

Bản cập nhật / chèn hàng loạt Postgres an toàn. Có lẽ một hàm có một mảng?

Ở đây buổi sáng ở Bờ biển Viễn Nam của NSW, và tôi nghĩ rằng tôi sẽ có thêm một vết nứt nữa tại thời điểm này. Tôi nên đề cập trước rằng môi trường triển khai của chúng tôi là RDS, điều này làm cho COPY kém hấp dẫn hơn. Nhưng ý tưởng chuyển vào một mảng trong đó mỗi phần tử bao gồm dữ liệu hàng là rất hấp dẫn. Nó giống như một INSERT nhiều giá trị, nhưng với các đường cú pháp khác nhau. Tôi đã xem xét các mảng trong Postgres một chút và luôn bị bối rối bởi cú pháp. Tôi đã tìm thấy một vài chủ đề thực sự xuất sắc với nhiều chi tiết từ một số áp phích hàng đầu để nghiên cứu:

https://dba.stackexchange .com / question / 224785 / pass-array-of-mix-type-into-storage-function

https ://dba.stackexchange.com/questions/131505/use-array-of-composite-type-as- Chức năng-parameter-and-access-it

https://dba.stackexchange.com/questions/225176/how-to-pass-an-array-to-a-plpgsql- Chức năng-with-variadic-parameter/

Từ đó, tôi có một hàm kiểm tra đang hoạt động:

DROP FUNCTION IF EXISTS data.item_insert_array (item[]);

CREATE OR REPLACE FUNCTION data.item_insert_array (data_in item[]) 
  RETURNS int
AS $$
INSERT INTO item (
    id, 
    marked_for_deletion, 
    name_)

SELECT
    d.id, 
    d.marked_for_deletion,
    d.name_

FROM unnest(data_in) d

ON CONFLICT(id) DO UPDATE SET 
    marked_for_deletion = EXCLUDED.marked_for_deletion,
    name_ = EXCLUDED.name_;

SELECT cardinality(data_in); -- array_length() doesn't work. ¯\_(ツ)_/¯

$$ LANGUAGE sql;

ALTER FUNCTION data.item_insert_array(item[]) OWNER TO user_bender;

Để đóng vòng kết nối, đây là ví dụ về một số đầu vào:

select * from item_insert_array(

    array[
        ('2f888809-2777-524b-abb7-13df413440f5',true,'Salad fork'),
        ('f2924dda-8e63-264b-be55-2f366d9c3caa',false,'Melon baller'),
        ('d9ecd18d-34fd-5548-90ea-0183a72de849',true,'Fondue fork')
        ]::item[]
    );

Quay trở lại kết quả thử nghiệm của tôi, điều này hoạt động gần giống như phần chèn đa giá trị ban đầu của tôi. Hai phương pháp khác mà tôi đã đăng ban đầu, giả sử chậm hơn 4 lần. (Kết quả khá thất thường, nhưng chúng luôn chậm hơn rất nhiều.) Nhưng tôi vẫn còn nguyên với câu hỏi ban đầu của mình:

Thuốc tiêm này có an toàn không?

Nếu không, tôi đoán tôi cần phải viết lại nó trong PL / pgSQL với vòng lặp FOREACH và THỰC HIỆN ... SỬ DỤNG hoặc ĐỊNH DẠNG để có được các tính năng xử lý nội suy / xử lý văn bản làm sạch chèn ở đó. Có ai biết không?

Tôi có rất nhiều câu hỏi khác về chức năng này (Nó có phải là một thủ tục để tôi có thể quản lý giao dịch không? Làm cách nào để thực hiện đầu vào anyarray? Kết quả trả về sẽ là gì?) Nhưng tôi nghĩ tôi sẽ phải theo đuổi những câu hỏi đó như những câu hỏi của riêng họ.

Cảm ơn mọi sự giúp đỡ!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tiếp tục giao dịch Postgres với các ngoại lệ trong Java

  2. Múi giờ với thời gian tiết kiệm ánh sáng ban ngày trong PostgreSQL

  3. đúng cách để bắt đầu / dừng cơ sở dữ liệu postgres pg_ctl hoặc dịch vụ postgres

  4. Sử dụng sails.js với cơ sở dữ liệu postgres hiện có

  5. Làm cách nào để khởi động PostgreSQL trên Windows?