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

INSERT [...] ON CONFLICT có thể được sử dụng cho các vi phạm khóa ngoại không?

Có, hãy nối các hàng đầu vào của bạn vào bảng được tham chiếu, do đó xóa các hàng không khớp trên cột FK:

INSERT INTO entries(entry_id, referenced_id, name)
SELECT val.entry_id, val.referenced_id, val.name
FROM  (
  VALUES (1, 2, 'references two')
         -- more?
  ) val (entry_id, referenced_id, name)
JOIN   referenced USING (referenced_id)  -- drop rows without matching FK
ON     CONFLICT (entry_id) DO NOTHING;   -- drop rows with duplicate id

Bản thân UPSERT (INSERT ... ON CONFLICT DO NOTHING ) chỉ phản ứng với các vi phạm duy nhất. Hướng dẫn sử dụng:

ON CONFLICT có thể được sử dụng để chỉ định một hành động thay thế để nâng cao một ràng buộc duy nhất hoặc lỗi vi phạm ràng buộc loại trừ. (Xem Điều khoản ON MFLICT bên dưới.)

Kể từ khi VALUES biểu thức hiện không được đính kèm với INSERT trực tiếp, các loại cột không có nguồn gốc từ bảng đích. Bạn có thể cần phải truyền giá trị đầu vào rõ ràng khi hoạt động với các kiểu không cơ bản. Xem:

  • Truyền kiểu NULL khi cập nhật nhiều hàng



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giới hạn hiệu suất của các giải pháp sao chép hợp lý

  2. Django + Psycopg2:InterfaceError:chỉ hỗ trợ giao thức 3

  3. Bạn có thể tạo chỉ mục trong định nghĩa TẠO BẢNG không?

  4. Đối số tùy chọn trong hàm PL / pgSQL

  5. Các khóa chính với Apache Spark