PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Apakah mungkin untuk menangkap pelanggaran kunci asing di postgres

Jika Anda hanya menyisipkan satu baris dalam satu waktu, Anda dapat membuat titik simpan sebelum penyisipan dan rollback ke sana saat penyisipan gagal (atau lepaskan saat penyisipan berhasil).

Untuk Postgres 9.5 atau yang lebih baru, Anda dapat menggunakan INSERT ... ON CONFLICT DO NOTHING yang melakukan apa yang dikatakannya. Anda dapat juga tulis ON CONFLICT DO UPDATE SET column = value... , yang secara otomatis akan mengonversi sisipan Anda menjadi pembaruan baris yang bertentangan dengan Anda (fungsi ini terkadang disebut "upsert").

Ini tidak berfungsi karena OP berurusan dengan kunci asing kendala daripada unik paksaan. Dalam hal ini, Anda dapat dengan mudah menggunakan metode savepoint yang saya jelaskan sebelumnya, tetapi untuk beberapa baris mungkin terbukti membosankan. Jika Anda perlu menyisipkan beberapa baris sekaligus, sebaiknya Anda membaginya menjadi beberapa pernyataan penyisipan, disediakan Anda tidak bekerja dalam mode autocommit , semua penyisipan terjadi dalam satu transaksi, dan Anda tidak memasukkan jumlah baris yang sangat banyak.

Terkadang, Anda benar-benar membutuhkan banyak sisipan dalam satu pernyataan, karena biaya bolak-balik untuk berbicara dengan database Anda ditambah biaya memiliki titik simpan di setiap sisipan terlalu tinggi. Dalam hal ini, ada sejumlah pendekatan yang tidak sempurna. Mungkin paling tidak buruk adalah membuat kueri bersarang yang memilih data Anda dan menggabungkannya dengan tabel lain, seperti ini:

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. SQL query 6 derajat pemisahan untuk analisis jaringan

  2. Permintaan Django dengan order_by, berbeda dan batas pada Postgresql

  3. Go sql - cakupan pernyataan yang disiapkan

  4. Bisakah saya menggunakan fungsi Postgres untuk menemukan titik di dalam persegi panjang berputar dengan ukuran tetap?

  5. Bagaimana Fungsi Radian() Bekerja di PostgreSQL