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

Czy można wykryć naruszenie klucza obcego w postgresie?

Jeśli wstawiasz tylko jeden wiersz na raz, możesz utworzyć punkt zapisu przed wstawką i wycofywanie do niego, gdy wstawka się nie powiedzie (lub uwolnij ją kiedy wstawienie się powiedzie).

W przypadku Postgresa 9.5 lub nowszego możesz użyć INSERT ... ON CONFLICT DO NOTHING który robi to, co mówi. Możesz również napisz ON CONFLICT DO UPDATE SET column = value... , który automagicznie przekształci wstawkę w aktualizację wiersza, z którym występuje konflikt (ta funkcja jest czasami nazywana „upsert”).

To nie działa, ponieważ OP ma do czynienia z kluczem obcym ograniczenie, a nie unikalny ograniczenie. W takim przypadku możesz najłatwiej skorzystać z metody punktu zapisu, którą opisałem wcześniej, ale dla wielu wierszy może to okazać się nużące. Jeśli potrzebujesz wstawić wiele wierszy naraz, podzielenie ich na wiele instrukcji wstawiania powinno być rozsądnie wydajne, pod warunkiem nie pracujesz w trybie automatycznego zatwierdzania , wszystkie wstawienia występują w jednej transakcji i nie wstawiasz bardzo dużej liczby wierszy.

Czasami naprawdę potrzebujesz wielu wstawek w jednej instrukcji, ponieważ narzut związany z komunikacją z bazą danych oraz koszt posiadania punktów zapisu przy każdym wstawieniu jest po prostu zbyt wysoki. W tym przypadku istnieje wiele niedoskonałych podejść. Prawdopodobnie najmniej zły jest zbudowanie zagnieżdżonego zapytania, które wybiera dane i łączy je z inną tabelą, coś takiego:

INSERT INTO table_A (column_A, column_B, column_C)
SELECT A_rows.*
FROM VALUES (...) AS A_rows(column_A, column_B, column_C)
JOIN table_B ON A_rows.column_B = table_B.column_B;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Co to jest PostgreSQL?

  2. Przejście z MySQL na PostgreSQL - wskazówki, triki i niedogodności?

  3. TypeORM warunkowy dopuszczający wartość null?

  4. wartość jest za długa, aby zmienić znak typu (N)

  5. Konfiguracja Postgresa w Grails