MyISAM mendukung perilaku ini. Buat kunci utama dua kolom, dan buat kedua penambahan kolom secara otomatis. Ini akan dimulai dari awal untuk setiap nilai yang berbeda di kolom pertama.
CREATE TABLE t (i INT, j INT AUTO_INCREMENT, PRIMARY KEY (i,j)) ENGINE=MyISAM;
INSERT INTO t (i) VALUES (1), (1), (2), (2), (1), (3);
SELECT * FROM t;
+---+---+
| i | j |
+---+---+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 3 | 1 |
+---+---+
Tetapi jika Anda memikirkannya, ini hanya thread-safe di mesin penyimpanan yang melakukan penguncian tingkat tabel untuk pernyataan INSERT. Karena INSERT harus mencari baris lain dalam tabel untuk menemukan j
maks nilai per i
. yang sama nilai. Jika orang lain melakukan INSERT secara bersamaan, itu menciptakan kondisi balapan.
Jadi, ketergantungan pada MyISAM, yang melakukan penguncian tingkat tabel pada INSERT.
Lihat referensi ini di manual:http:// dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html di bawah bagian, Catatan MyISAM .
Ada banyak alasan bagus untuk tidak menggunakan MyISAM. Faktor penentu bagi saya adalah kecenderungan MyISAM untuk merusak data.
Kembali komentar Anda:
InnoDB tidak mendukung perilaku kenaikan per grup yang dijelaskan di atas. Anda dapat membuat kunci utama multi-kolom, tetapi kesalahan yang Anda dapatkan adalah karena InnoDB mengharuskan kolom peningkatan otomatis menjadi kolom pertama dalam kunci tabel (tidak sepenuhnya harus menjadi kunci utama)
Terlepas dari posisi kolom kenaikan otomatis di kunci multi-kolom, itu hanya bertambah ketika Anda menggunakannya dengan InnoDB; itu tidak menomori entri per nilai yang berbeda di kolom lain.
Untuk melakukan ini dengan tabel InnoDB, Anda harus mengunci tabel secara eksplisit selama durasi INSERT, untuk menghindari kondisi balapan. Anda akan melakukan kueri SELECT Anda sendiri untuk nilai maksimal dalam grup yang Anda masukkan. Kemudian masukkan nilai itu + 1.
Pada dasarnya, Anda harus melewati fitur peningkatan otomatis dan menentukan nilai alih-alih membuatnya secara otomatis.