sql >> Database >  >> RDS >> PostgreSQL

Kan INSERT [...] ON CONFLICT worden gebruikt voor schendingen van buitenlandse sleutels?

Ja, voeg uw invoerrijen toe aan de tabel waarnaar wordt verwezen, en verwijder daarmee rijen zonder overeenkomst in de FK-kolom:

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

De UPSERT zelf (INSERT ... ON CONFLICT DO NOTHING ) reageert alleen op unieke overtredingen. De handleiding:

ON CONFLICT kan worden gebruikt om een ​​alternatieve actie op te geven voor het opwerpen van een unieke beperking of schending van een uitsluitingsbeperking. (Zie ON CONFLICT-clausule hieronder.)

Sinds de VALUES expressie is nu niet gekoppeld aan een INSERT direct worden kolomtypen niet afgeleid van de doeltabel. Mogelijk moet je casten waarden expliciet invoeren bij het werken met niet-basistypen. Zie:

  • NULL-type casten bij het bijwerken van meerdere rijen



  1. Hoe kan ik een SQL Server 2008 DateTimeOffset converteren naar een DateTime?

  2. Easysoft ODBC-stuurprogramma's en de ODBCINST-bibliotheek

  3. Hoe een nieuwe regel correct in te voegen in nvarchar

  4. Hoe de huidige datum in SQLite te krijgen