Nâng cấp
Câu trả lời của Linoff
là đúng nhưng có thể đơn giản hóa một chút bằng tính năng "UPSERT" mới của Postgres 9.5
(a.k.a. MERGE
). Tính năng mới đó được triển khai trong Postgres với tên INSERT ON CONFLICT
cú pháp.
Thay vì kiểm tra rõ ràng xem có vi phạm chỉ mục duy nhất hay không, chúng tôi có thể để ON CONFLICT
khoản phát hiện vi phạm. Sau đó, chúng tôi DO NOTHING
, nghĩa là chúng tôi từ bỏ nỗ lực INSERT
mà không cần phải thử UPDATE
. Vì vậy, nếu chúng tôi không thể chèn, chúng tôi chỉ cần chuyển sang hàng tiếp theo.
Chúng tôi nhận được kết quả tương tự như mã của Linoff nhưng mất WHERE
mệnh đề.
INSERT INTO bigtable(col1, … )
SELECT col1, …
FROM stagingtable st
ON CONFLICT idx_bigtable_col1_col2_col
DO NOTHING
;