Saya mengerti bahwa pemicu pada tabel t didefinisikan dengan FOR EACH STATEMENT
akan berjalan sekali ketika saya menjalankan UPDATE t ...
.
Sekarang, ketika t
didefinisikan dengan FOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADE
, dan saya memperbarui N baris a
, akankah hal itu menyebabkan pemicu dipanggil sekali, atau N kali?
Dengan kata lain, apakah perubahan pada tabel yang disebabkan oleh batasan FK lebih seperti satu UPDATE
, atau lebih seperti serangkaian UPDATE
s?
postgresql
trigger
foreign-key
postgresql-9.2
Hanno Fietz
sumber
sumber
FOR EACH STATEMENT
adalah ortogonal untuk sisa pertanyaan. Kendala FK diimplementasikan dengan pemicu khususFOR EACH ROW
.Jawaban:
Batasan kunci asing saat ini diimplementasikan dengan pemicu internal khusus. Semuanya dijalankan
FOR EACH ROW
.Perhatikan bahwa ini adalah detail implementasi yang dapat berubah, jadi jangan bergantung padanya. Tetapi dasar-dasarnya tidak berubah selama beberapa versi utama terakhir, jadi perubahan besar tidak mungkin.
Saya menjalankan tes cepat dengan batasan FK sederhana dari
tbl
ketbltype
. FK sederhana diimplementasikan dengan empat pemicu internal sederhanaFOR EACH ROW
dalam pengujian saya di hal 9.4.Berikut ini ikhtisar singkat tentang cara menyelidiki:
Dua "noaksi" internal terpicu
tbltype
.Dua "cek" internal diaktifkan
tbl
.Semuanya dijalankan
FOR EACH ROW
, seperti yang ditunjukkan oleh angka ganjil ditgtype
.2 byte Postgres
tgtype smallint
mewakiliint16
kode sumber C di mana bit paling sedikit dikodekanTRIGGER_TYPE_ROW
. Penjelasan terperinci di sini:Anda dapat dengan mudah menguji ini dengan sepasang pemicu identik di mana Anda hanya mengubah
FOR ROW
/STATEMENT
...sumber
Itu mengeksekusi N kali, dan cara termudah untuk melihat ini adalah dengan mengeksekusi pernyataan tersebut
EXPLAIN ANALYZE
, yaituIni akan memberi Anda informasi yang mirip dengan ini:
Trigger for constraint t_col_fk on a: time=1.300 calls=9
(diuji dengan 9.2)
sumber