PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Czy INSERT [...] ON CONFLICT można użyć do naruszeń kluczy obcych?

Tak, połącz swoje wiersze wejściowe z tabelą odniesienia, usuwając w ten sposób wiersze bez dopasowania w kolumnie 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

Sam UPERT (INSERT ... ON CONFLICT DO NOTHING ) reaguje tylko na unikalne naruszenia. Instrukcja:

ON CONFLICT może służyć do określenia akcji alternatywnej do zgłaszania błędu unikatowego ograniczenia lub naruszenia ograniczenia wykluczenia. (Patrz klauzula O KONFLIKTACH poniżej).

Ponieważ VALUES wyrażenie nie jest teraz dołączone do INSERT bezpośrednio typy kolumn nie pochodzą z tabeli docelowej. Może być konieczne przesyłanie wartości wejściowe jawnie podczas pracy z typami innymi niż podstawowe. Zobacz:

  • Rzutowanie typu NULL podczas aktualizowania wielu wierszy



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres 9.1 vs Mysql 5.6 InnoDB?

  2. Django+Postgres:bieżąca transakcja jest przerwana, polecenia ignorowane do końca bloku transakcji

  3. Jak wyjść z narzędzia wiersza poleceń PostgreSQLs (psql)

  4. Jak uzyskać nazwy kolumn listy i typy danych tabeli w PostgreSQL?

  5. Tablica PHP do tablicy postgres