PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

O INSERT [...] ON CONFLICT pode ser usado para violações de chave estrangeira?


Sim, junte suas linhas de entrada à tabela referenciada, removendo assim as linhas sem correspondência na coluna 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

O próprio UPSERT (INSERT ... ON CONFLICT DO NOTHING ) reage apenas a violações exclusivas. O manual:

ON CONFLICT pode ser usado para especificar uma ação alternativa para gerar uma restrição exclusiva ou erro de violação de restrição de exclusão. (Consulte a Cláusula SOBRE CONFLITO abaixo.)

Uma vez que os VALUES expressão agora não está anexada a um INSERT diretamente, os tipos de coluna não são derivados da tabela de destino. Talvez seja necessário transmitir valores de entrada explicitamente ao operar com tipos não básicos. Ver:
  • Como converter o tipo NULL ao atualizar várias linhas