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