Masalah yang menarik. Ini adalah tebakan terbaik saya. Saya tidak mengujinya.
Secara umum, tebakan terpelajar postgres tentang pernyataan efek apa yang akan terjadi pada data tidak meluas ke logika pemicu. Saat menjalankan pernyataan kedua, postgres melihat batasan kunci asing, dan mengetahui bahwa ia harus memeriksa apakah nilai yang diberikan (dimasukkan) valid, yaitu, jika itu mewakili kunci yang valid dalam tabel asing. Ada kemungkinan, betapapun buruknya, pemicu dapat memengaruhi validitas kunci asing yang diusulkan (misalnya, jika pemicu menghapus catatan).
(kasus 1) Jika tidak ada pemicu, maka dapat melihat data (baik pra-komit dan bertahap untuk komit) dan memutuskan apakah nilai yang diusulkan dijamin valid. (kasus 2) Jika tidak ada kendala FK, maka pemicu tidak dapat mempengaruhi validitas penyisipan, sehingga diperbolehkan. (kasus 3) Jika Anda menghilangkan detail_id=null
, tidak ada perubahan dalam pembaruan sehingga pemicu tidak menyala, sehingga keberadaannya tidak relevan.
Saya mencoba menghindari kendala dan pemicu FK bila memungkinkan. Lebih baik, menurut pendapat saya, membiarkan basis data secara tidak sengaja berisi sebagian data yang salah daripada menggantungnya sepenuhnya, seperti yang Anda lihat di sini. Saya akan menghapus semua kendala dan pemicu FK, dan memaksa semua operasi pembaruan dan penyisipan untuk beroperasi melalui fungsi tersimpan, yang melakukan validasi di dalam kunci mulai/komit, dan menangani upaya penyisipan/pembaruan yang salah/tidak valid dengan tepat dan segera, daripada memaksa postgres untuk tunggu perintah 1 untuk melakukan sebelum memutuskan apakah perintah 2 diperbolehkan.
Sunting: lihat pertanyaan ini
Sunting 2 Hal terdekat yang dapat saya temukan untuk dokumentasi resmi seputar waktu pemicu relatif terhadap pemeriksaan kendala adalah ini dari dokumen pemicu
Ini agak tidak jelas, jika pemicu yang terjadi sebelum pemeriksaan kendala berlaku untuk pemeriksaan kendala transaksi lainnya. Apa pun masalahnya, masalah ini adalah bug atau tidak terdokumentasi dengan baik.