Ở đâ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
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 đỡ!