Saya tahu MySQL membatasi kolom auto_increment ke kunci primer. Kenapa ini? Pikiran pertama saya adalah pembatasan kinerja, karena mungkin ada beberapa meja penghitung di suatu tempat yang harus dikunci untuk mendapatkan nilai ini.
Mengapa saya tidak dapat memiliki beberapa kolom auto_increment di tabel yang sama?
Terima kasih.
mysql
primary-key
auto-increment
Christopher Armstrong
sumber
sumber
Jawaban:
Mengapa Anda ingin memiliki kolom auto_increment yang bukan kunci utama?
Jika Anda ingin sebuah kolom menjadi auto_increment, menurut definisi, Anda tidak menyimpan data yang bermakna dalam kolom itu. Satu-satunya kasus di mana menyimpan informasi yang tidak bermakna masuk akal adalah kasus khusus yang Anda ingin memiliki kunci primer sintetis. Dalam hal itu, kurangnya informasi adalah keuntungan karena tidak ada risiko seseorang akan datang di masa depan dan ingin mengubah data karena beberapa atribut dari beberapa entitas berubah.
Memiliki beberapa kolom auto_increment di tabel yang sama tampaknya lebih aneh. Kedua kolom akan memiliki data yang sama - mereka dihasilkan oleh algoritma yang sama dan diisi pada saat yang sama. Saya kira Anda bisa membuat implementasi di mana mungkin bagi mereka untuk sedikit tidak sinkron jika ada cukup sesi bersamaan. Tapi saya tidak bisa membayangkan bagaimana itu akan berguna dalam suatu aplikasi.
sumber
Sebenarnya atribut AUTO_INCREMENT tidak terbatas pada PRIMARY KEY (lagi). Dulu begitu dalam versi lama - pasti 3,23 dan mungkin 4.0. Masih manual MySQL untuk semua versi sejak 4.1 berbunyi seperti ini
Jadi Anda memang dapat memiliki kolom AUTO_INCREMENT dalam tabel yang bukan kunci utama. Jika itu masuk akal, adalah topik yang berbeda.
Saya juga harus menyebutkan bahwa kolom AUTO_INCREMENT harus selalu menjadi tipe integer (secara teknis tipe floating point juga diperbolehkan) dan harus TIDAK DITANDATANGANI. Tipe yang DITANDATANGANI tidak hanya membuang setengah ruang utama, tetapi juga dapat menyebabkan masalah besar jika nilai negatif dimasukkan secara tidak sengaja.
Akhirnya MySQL 4.1 dan yang lebih baru mendefinisikan jenis alias SERIAL untuk BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.
sumber
Ini adalah pertanyaan yang menarik karena database yang berbeda memiliki pendekatan unik untuk menyediakan auto_increment.
MySQL : Hanya satu kunci auto_increment yang dihasilkan untuk mengidentifikasi baris dalam tabel secara unik. Tidak banyak penjelasan di balik alasannya, tetapi hanya implementasi. Bergantung pada tipe data, nilai auto_increment ditetapkan oleh panjang tipe data dalam byte:
PostgreSQL
Seri datatype internal digunakan untuk kenaikan otomatis dari 1 menjadi 2.147.483.647. Rentang yang lebih besar diizinkan menggunakan bigserial.
Oracle : Objek skema yang disebut SEQUENCE dapat membuat angka baru dengan hanya memanggil fungsi nextval. PostgreSQL juga memiliki mekanisme seperti itu.
Berikut adalah URL yang bagus yang menyediakan bagaimana DB lain menentukannya: http://www.w3schools.com/sql/sql_autoincrement.asp
Sekarang mengenai pertanyaan Anda, jika Anda benar-benar ingin memiliki beberapa kolom auto_increment dalam satu tabel, Anda harus meniru itu.
Dua alasan mengapa Anda harus meniru ini:
Bagaimana Anda meniru itu ???
Menggunakan beberapa tabel yang hanya memiliki satu kolom auto_increment dan memetakannya ke kolom yang diinginkan di tabel target. Berikut ini sebuah contoh:
Salin dan Tempel Contoh Ini:
Ini akan membuat tabel kuis pop untuk guru. Saya juga membuat lima emulator urutan, satu untuk setiap hari dalam minggu sekolah. Setiap emulator urutan bekerja dengan memasukkan nilai 0 di kolom val. Jika urutan emulator kosong, itu dimulai dengan val 0, nextval 1. Jika tidak, kolom nextval bertambah. Anda kemudian dapat mengambil kolom nextval dari emulator urutan.
Berikut adalah contoh hasil dari contoh:
Jika Anda benar-benar membutuhkan beberapa nilai kenaikan otomatis di MySQL, ini adalah cara terdekat untuk menirunya.
Cobalah !!!
UPDATE 2011-06-23 21:05
Saya baru saja perhatikan pada contoh saya, saya tidak menggunakan nilai @pop.
Kali ini saya mengganti 'pop_tue = pop_tue +1' dengan 'pop_tue = @pop' dan mencoba kembali contohnya:
sumber
bigserial
tipe data yang menawarkan rentang yang jauh lebih besar dariSeperti yang XL katakan, itu tidak terbatas hanya pada kunci primer. Ini adalah batasan potensial bahwa Anda hanya dapat memiliki satu kolom seperti itu per tabel tetapi solusi terbaik adalah menghasilkan sebanyak mungkin angka yang Anda butuhkan di tabel lain dan kemudian memasukkannya ke tempat yang Anda inginkan.
sumber