Да, присъединете въведените си редове към посочената таблица, като по този начин премахнете редове без съвпадение в колоната 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
Самият UPSERT (INSERT ... ON CONFLICT DO NOTHING
) реагира само на уникални нарушения. Ръководството:
ON CONFLICT
може да се използва за определяне на алтернативно действие за издигане на грешка при нарушение на уникално ограничение или ограничение за изключване. (Вижте клауза ЗА КОНФЛИКТ по-долу.)
Тъй като VALUES
изразът вече не е прикачен към INSERT
директно, типовете колони не се извличат от целевата таблица. Може да се наложи да прехвърляте входни стойности изрично при работа с неосновни типове. Вижте:
- Прехвърляне на NULL тип при актуализиране на няколко реда