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

Tại sao quy tắc này không ngăn các vi phạm chính trùng lặp?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chức năng tạo PostgreSQL

  2. Với Rails, làm cách nào để tôi có thể truy vấn db để biết số tổng hợp và được nhóm lại theo tuần?

  3. di chuyển từ sqlite sang postgresql ở django

  4. Có thể sử dụng một biến và không chỉ định kiểu trả về trong postgreSQL không?

  5. Làm thế nào để sử dụng case-when trong Ecto Queries trong elixir?