Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle:perbedaan antara max(id)+1 dan sequence.nextval

Dengan select max(id) + 1 pendekatan, dua sesi memasukkan secara bersamaan akan melihat ID maks yang sama saat ini dari tabel, dan keduanya memasukkan nilai ID baru yang sama. Satu-satunya cara untuk menggunakan ini dengan aman adalah mengunci meja sebelum memulai transaksi, yang menyakitkan dan membuat serial transaksi. (Dan seperti yang ditunjukkan Stijn, nilai dapat digunakan kembali jika catatan tertinggi dihapus). Pada dasarnya, jangan pernah menggunakan pendekatan ini. (Mungkin terkadang ada alasan kuat untuk melakukannya, tapi saya tidak yakin pernah melihatnya).

Urutan menjamin bahwa kedua sesi akan mendapatkan nilai yang berbeda, dan tidak diperlukan serialisasi. Ini akan bekerja lebih baik dan lebih aman, lebih mudah dikodekan, dan lebih mudah dirawat.

Satu-satunya cara Anda bisa mendapatkan kesalahan duplikat menggunakan urutan adalah jika catatan sudah ada di tabel dengan ID di atas nilai urutan, atau jika ada sesuatu yang masih memasukkan catatan tanpa menggunakan urutan. Jadi, jika Anda memiliki tabel yang sudah ada dengan ID yang dimasukkan secara manual, katakanlah 1 hingga 10, dan Anda membuat urutan dengan nilai awal-awal default 1, penyisipan pertama menggunakan urutan akan mencoba memasukkan ID 1 - yang sudah ada . Setelah mencoba 10 kali urutannya akan memberi Anda 11, yang akan berhasil. Jika Anda kemudian menggunakan pendekatan max-ID untuk melakukan penyisipan berikutnya yang akan menggunakan 12, tetapi urutannya akan tetap pada 11 dan juga akan memberi Anda 12 saat berikutnya Anda memanggil nextval .

Urutan dan tabel tidak terkait. Urutan tidak diperbarui secara otomatis jika nilai ID yang dibuat secara manual dimasukkan ke dalam tabel, sehingga kedua pendekatan tidak bercampur. (Antara lain, urutan yang sama dapat digunakan untuk menghasilkan ID untuk beberapa tabel, seperti yang disebutkan dalam dokumen).

Jika Anda mengubah dari pendekatan manual ke pendekatan urutan, Anda perlu memastikan urutan dibuat dengan nilai awal yang lebih tinggi dari semua ID yang ada dalam tabel, dan bahwa semua yang melakukan penyisipan menggunakan urutan hanya di masa depan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi NUMTODSINTERVAL() di Oracle

  2. Membuat pemicu di Oracle Express

  3. Bagaimana cara menulis skrip penyisipan Oracle dengan satu bidang sebagai CLOB?

  4. Basis data Oracle Pra-Built untuk pembelajaran dan pengujian menggunakan Oracle Developer VM

  5. Bagaimana cara memeriksa versi JDK di Oracle?