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

Batasan yang ditentukan DEFERRABLE AWAL SEGERA masih DEFERRED?

Saya ingat telah mengangkat poin yang hampir sama ketika PG9 dalam kondisi alfa. Inilah jawaban dari Tom Lane (pengembang inti PG profil tinggi):
http://archives.postgresql.org/pgsql-general/2010-01/msg00221.php

Singkatnya:tidak akan diperbaiki.

Bukan untuk mengatakan bahwa saya setuju dengan saran Anda bahwa perilaku saat ini adalah bug. Lihatlah dari sudut yang berlawanan:ini adalah perilaku NOT DEFERRABLE itu salah.

Faktanya, pelanggaran kendala dalam UPDATE ini seharusnya tidak pernah terjadi, karena pada akhir UPDATE kendala terpenuhi. Keadaan di akhir perintah adalah yang terpenting. Status perantara selama eksekusi satu pernyataan tidak boleh diekspos ke pengguna.

Sepertinya PostgreSQL mengimplementasikan batasan yang tidak dapat ditangguhkan dengan memeriksa duplikat setelah setiap baris diperbarui dan langsung gagal pada duplikat pertama, yang pada dasarnya cacat. Tapi ini adalah masalah yang diketahui, mungkin setua PostgreSQL. Saat ini solusi untuk ini justru menggunakan batasan DEFERRABLE. Dan ada beberapa ironi bahwa Anda melihatnya sebagai kekurangan karena gagal gagal, sementara entah bagaimana itu seharusnya menjadi solusi untuk kegagalan di tempat pertama!

Ringkasan status quo sejak PostgreSQL 9.1

  • NOT DEFERRABLE UNIQUE atau PRIMARY KEY batasan diperiksa setelah setiap baris .

  • DEFERRABLE batasan diatur ke IMMEDIATE (INITIALLY IMMEDIATE atau melalui SET CONSTRAINTS ) dicentang setelah setiap pernyataan .

  • DEFERRABLE batasan disetel ke DEFERRED (INITIALLY DEFERRED atau melalui SET CONSTRAINTS ) dicentang setelah setiap transaksi .

Perhatikan perlakuan khusus UNIQUE / PRIMARY KEY constraint. Mengutip halaman manual untuk CREATE TABLE :

Batasan yang tidak dapat ditangguhkan akan segera diperiksa setelah setiap perintah .

Sementara itu menyatakan lebih jauh di Kompatibilitas bagian di bawah Non-deferred uniqueness constraints :

Ketika UNIQUE atau PRIMARY KEY batasan tidak dapat ditangguhkan, PostgreSQL segera memeriksa keunikan setiap kali baris dimasukkan atau dimodifikasi. Standar SQL mengatakan bahwa keunikan harus dipaksakan hanya di akhir pernyataan; ini membuat perbedaan ketika, misalnya, satu perintah memperbarui beberapa nilai kunci. Untuk mendapatkan perilaku yang sesuai standar, nyatakan batasan sebagaiDEFERRABLE tetapi tidak ditangguhkan (yaitu, INITIALLY IMMEDIATE ). Ketahuilah bahwa ini bisa jauh lebih lambat daripada pemeriksaan keunikan langsung.

Penekanan saya yang berani.

Jika Anda membutuhkan FOREIGN KEY batasan untuk mereferensikan kolom, DEFERRABLE bukan pilihan karena (per dokumentasi):

Kolom yang direferensikan harus berupa kolom dari batasan kunci utama atau unik yang tidak dapat ditangguhkan dalam tabel yang direferensikan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konsep Oracle Ketersediaan Tinggi di PostgreSQL

  2. Apakah mungkin menggunakan variabel dan tidak menentukan tipe pengembalian di postgreSQL?

  3. Format tanggal UTC Postgres &pemeran zaman, tanda inversi

  4. BUAT TABEL PostgreSQL

  5. Oracle ke PostgreSQL — Kursor dan Ekspresi Tabel Umum