Ja, tilføj dine inputrækker til den refererede tabel, og fjern derved rækker uden match i FK-kolonnen:
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
Selve UPSERT (INSERT ... ON CONFLICT DO NOTHING
) reagerer kun på unikke overtrædelser. Manualen:
ON CONFLICT
kan bruges til at angive en alternativ handling til at rejse en unik begrænsnings- eller ekskluderingsbegrænsningsfejl. (Se ON CONFLICT-klausulen nedenfor.)
Siden VALUES
udtryk er nu ikke knyttet til en INSERT
direkte afledes kolonnetyper ikke fra måltabellen. Du skal muligvis caste inputværdier eksplicit, når der arbejdes med ikke-grundlæggende typer. Se:
- Caster NULL-typen ved opdatering af flere rækker