Saya baru-baru ini membaca bahwa karena bagaimana InnoDB menghitung ulang nilai AUTO_INCREMENT ketika server restart, catatan apa pun di ujung atas daftar ID mungkin memiliki ID mereka digunakan kembali.
Biasanya, ini bukan masalah, karena ketika pengguna dihapus semua yang terkait dengan ID juga dihapus dari tabel lain.
Tapi saya sengaja meninggalkan posting forum mereka yatim piatu, dilabeli sebagai "Diposting oleh = Pengguna # 123 =", sehingga percakapan sebelumnya tetap dipertahankan. Jelas, jika ID digunakan kembali, ini akan menjadi masalah.
Saya belum pernah mengalami masalah ini sebelumnya karena selalu ada cukup banyak pengguna baru yang membuat ID tidak mungkin digunakan kembali dengan cara ini. Namun pada pendaftaran proyek baru saya jarang dan penghapusan pengguna tidak aktif sering (terutama karena akun "Open Alpha" hanya berlangsung selama tiga hari sebagai pratinjau), dan penggunaan kembali ID tersebut telah terjadi tiga selama tiga sekarang.
Saya telah "memperbaiki" masalah dengan menyimpan nilai yang benar untuk AUTO_INCREMENT di tempat lain dan menggunakannya daripada mengandalkan nilai internal. Apakah ada cara aktual untuk membuat InnoDB mengingat nilai terakhir aktual?
Jawaban:
(menghindari masalah dengan tidak pernah menghapus)
Karena Anda ingin menyimpan
"Posted by =User #123="
informasi setelah Anda menghapus penggunaid=123
, Anda juga dapat mempertimbangkan menggunakan 2 tabel untuk menyimpan data pengguna. Satu untukActive
pengguna dan satu untuk semua (termasuk yang dihapus dari pengguna aktif). Dan jangan pernah menghapus id itu dariAllUser
tabel:Ini tentu saja akan mempersulit memasukkan operasi pengguna baru. Setiap pengguna baru akan berarti 2 sisipan, satu di setiap tabel. Menghapus pengguna akan dengan hanya menghapus dari
ActiveUser
tabel. Semua FK akan dihapus dengan cascading, kecuali posting forum, yang akan merujukAlluser
tabel (di mana tidak ada penghapusan akan pernah terjadi).sumber
Tidak ada cara alami untuk melakukan ini kecuali menggunakan information_schema.tables untuk merekam semua kolom dengan opsi auto_increment.
Anda bisa mengumpulkan kolom-kolom itu sebagai berikut:
Buat skrip yang akan mengatur ulang nilai auto_increment
Anda kemudian dapat melakukan satu dari dua hal:
OPSI # 1: Jalankan skrip secara manual setelah startup
OPSI # 2: Minta skrip mysqld mengeksekusi sebelum mengizinkan koneksi
Anda harus menambahkan opsi ini
Dengan begitu, setiap kali Anda me-restart mysql, skrip ini dijalankan di awal. Anda harus ingat untuk membuat ulang /var/lib/mysql/ResetAutoInc.sql sebelum melakukan restart mysql yang direncanakan.
sumber
Dokumen 5,5 menyarankan untuk menyimpan nilai kenaikan otomatis di tempat lain seperti yang sudah Anda miliki.
Solusi alternatif adalah meniru SEQUENCE sehingga Anda tidak menggunakan kenaikan otomatis dalam tabel itu sendiri. Ini telah dibahas pada SO sebelumnya dan lagi . The MySQL Kinerja blog menyebutkan itu.
Namun data MySQL lain yang tidak dimiliki RDBMS lain ...
sumber
Hanya saja, jangan menghapus pengguna. Integritas relasional lebih penting. Jika Anda harus melakukannya karena alasan privasi atau apa pun, cukup ubah nama pengguna menjadi 'dihapus' dan kosongkan bidang lainnya.
sumber
Ini adalah pertanyaan lama dan masih relevan.
1) Perilaku ini diperbaiki di Mysql 8.0.
2) Salah satu solusinya adalah menggunakan baris dummy ke data Anda, untuk menjaga AUTO_INCREMENT di atas nilai tertentu. Tidak super nyaman tergantung pada apa yang Anda simpan, tetapi merupakan solusi sederhana dalam beberapa kasus.
sumber
Kami membutuhkan solusi ekstrapolasi untuk sistem kami sendiri berdasarkan instruksi pada posting ini. Jika ini dapat membantu siapa pun mencapai tujuan mereka dengan cara yang bahkan lebih mudah.
Sistem kami menggunakan pola tabel batu nisan untuk menyimpan barang yang dihapus karena kami melakukan sinkronisasi 2 arah pada sistem yang terputus, jadi kami menggunakan kode ini untuk mencocokkan tabel batu nisan dengan tabel langsungnya dan mengekstrak nilai setinggi mungkin :)
sumber