Secara umum disepakati bahwa kunci utama harus tidak dapat diubah (atau sestabil mungkin karena kekekalan tidak dapat diterapkan dalam DB). Meskipun tidak ada yang akan mencegah Anda memperbarui kunci utama (kecuali batasan integritas), ini mungkin bukan ide yang baik:
Dari sudut pandang kinerja:
- Anda perlu memperbarui semua kunci asing yang merujuk pada kunci yang diperbarui. Pembaruan tunggal dapat menyebabkan pembaruan banyak tabel/baris.
- Jika kunci asing tidak diindeks (!!), Anda harus mempertahankan kunci pada tabel anak untuk memastikan integritas. Oracle hanya akan menahan kunci untuk waktu yang singkat tapi tetap saja, ini menakutkan.
- Jika kunci asing Anda diindeks (sebagaimana mestinya), pembaruan akan mengarah ke pembaruan indeks (hapus+masukkan dalam struktur indeks), ini biasanya lebih mahal daripada pembaruan aktual dari tabel dasar.
- Dalam tabel ORGANIZATION INDEX (dalam RDBMS lain, lihat kunci primer yang dikelompokkan), baris secara fisik diurutkan berdasarkan kunci utama. Pembaruan logis akan menghasilkan penghapusan+penyisipan fisik (lebih mahal)
Pertimbangan lain:
- Jika kunci ini direferensikan di sistem eksternal mana pun (cache aplikasi, DB lain, ekspor...), referensi akan rusak saat diperbarui.
- selain itu, beberapa RDBMS tidak mendukung CASCADE UPDATE, khususnya Oracle.
Kesimpulannya, selama desain, umumnya lebih aman menggunakan kunci pengganti sebagai pengganti kunci utama alami yang seharusnya tidak berubah -- tetapi pada akhirnya mungkin perlu diperbarui karena persyaratan yang berubah atau bahkan kesalahan entri data.
Jika Anda benar-benar harus memperbarui kunci utama dengan tabel anak-anak, lihat posting ini oleh Tom Kyte untuk solusinya.