Các quy tắc theo mặc định thêm mọi thứ vào hành động hiện tại :
Nhưng quy tắc INSTEAD cho phép bạn thay thế hành động:
Vì vậy, tôi nghĩ bạn muốn chỉ định INSTEAD :
CREATE OR REPLACE RULE ignore_duplicate_inserts AS
ON INSERT TO mytable
WHERE (EXISTS ( SELECT mytable.id
FROM mytable
WHERE mytable.id = new.id)) DO INSTEAD NOTHING;
Nếu không có INSTEAD, quy tắc của bạn về cơ bản là nói "làm INSERT và sau đó không làm gì" khi bạn muốn nói "thay vì INSERT, không làm gì cả" và AFAIK, DO INSTEAD NOTHING
sẽ làm điều đó.
Tôi không phải là chuyên gia về các quy tắc PostgreSQL nhưng tôi nghĩ việc thêm "INSTEAD" sẽ hoạt động.
CẬP NHẬT :Cảm ơn araqnid chúng tôi biết điều đó :
Vì vậy, một quy tắc sẽ không hoạt động trong tình huống này. Tuy nhiên, trình kích hoạt được kích hoạt trong quá trình SAO CHÉP TỪ nên bạn có thể viết CHÈN TRƯỚC kích hoạt sẽ trả về NULL khi nó phát hiện các hàng trùng lặp:
Điều đó nói rằng, tôi nghĩ bạn nên sử dụng "tải tất cả vào một bảng tạm thời, dọn dẹp và sao chép nó vào đích cuối cùng" của araqnid sẽ là một giải pháp hợp lý hơn cho hoạt động tải hàng loạt như bạn.