MySQL Örneklerle AUTO_INCREMENT
⚡ Akıllı Özet
MySQL AUTO_INCREMENT, her satır eklendiğinde sayısal bir sütun için otomatik olarak ardışık sayılar oluşturur. Bu özellik, benzersiz tanımlayıcıları elle hesaplama ihtiyacını ortadan kaldırarak birincil anahtarı doldurmanın standart yolu haline getirir.

Otomatik artış nedir?
Otomatik Artış, sayısal veri türleri üzerinde çalışan bir işlevdir. Otomatik artış olarak tanımlanan bir alan için tabloya her kayıt eklendiğinde otomatik olarak sıralı sayısal değerler üretir.
Bu özellik, TINYINT'ten BIGINT'e kadar her türlü tamsayı türünde çalışır. Sütunun ayrıca indekslenmesi gerekir; bu işlem, birincil anahtar olarak tanımlandığında otomatik olarak gerçekleşir.
Otomatik artış ne zaman kullanılır?
Ders kapsamında veritabanı normalizasyonuVerilerin, birincil ve yabancı anahtarlar kullanılarak birbirleriyle ilişkilendirilmiş birçok küçük tabloya depolanması yoluyla, minimum düzeyde veri tekrarıyla nasıl saklanabileceğine baktık.
Birincil anahtar benzersiz olmalıdır, çünkü veritabanındaki bir satırı benzersiz şekilde tanımlar. Peki birincil anahtarın her zaman benzersiz olmasını nasıl sağlayabiliriz?
Olası çözümlerden biri, veri eklemeden önce tabloda anahtarın varlığını kontrol eden bir formül kullanarak birincil anahtarı oluşturmaktır. Bu işe yarayabilir, ancak yaklaşım karmaşık ve hatasız değildir. Aynı anda veri ekleyen iki oturum yine de aynı maksimum değeri okuyabilir ve çakışmaya neden olabilir.
Bu tür karmaşıklığı önlemek ve birincil anahtarın her zaman benzersiz olmasını sağlamak için şunu kullanabiliriz: MySQL Birincil anahtarlar oluşturmak için otomatik artırma özelliği kullanılır. Otomatik artırma, INT veri türüyle birlikte kullanılır. INT veri türü hem işaretli hem de işaretsiz değerleri destekler. İşaretsiz veri türleri yalnızca pozitif sayılar içerebilir. En iyi uygulama olarak, otomatik artırma birincil anahtarında işaretsiz kısıtlaması tanımlanması önerilir.
Otomatik artış sözdizimi
Mantıksal açıklamalar yapıldıktan sonra, film kategorileri tablosunu oluşturmak için kullanılan metne bakalım.
CREATE TABLE `categories` ( `category_id` int UNSIGNED NOT NULL AUTO_INCREMENT, `category_name` varchar(150) DEFAULT NULL, `remarks` varchar(500) DEFAULT NULL, PRIMARY KEY (`category_id`) );
category_id alanındaki “AUTO_INCREMENT” ifadesine dikkat edin. Bu, tabloya yeni bir satır eklendiğinde kategori kimliğinin otomatik olarak oluşturulmasına neden olur. Tabloya veri eklenirken bu değer sağlanmaz. MySQL onu üretir.
Not: UNSIGNED anahtar kelimesi sütunun pozitif aralığını ikiye katlar ve bir zamanlar int(11) olarak yazılan görüntüleme genişliği artık kullanılmamaktadır. MySQL 8.0.17 ve sonrası. Düz int Bu, mevcut halidir.
Varsayılan olarak, AUTO_INCREMENT için başlangıç değeri 1'dir ve her yeni kayıt için 1 artırılır.
Şimdi kategori tablosunun mevcut içeriğini inceleyelim.
SELECT * FROM `categories`;
Yukarıdaki betiğin çalıştırılması MySQL Workbench'in myflixdb'ye karşı yaptığı test bize aşağıdaki sonuçları veriyor.
| category_id | category_name | remarks |
|---|---|---|
| 1 | Comedy | Movies with humour |
| 2 | Romantic | Love stories |
| 3 | Epic | Story acient movies |
| 4 | Horror | NULL |
| 5 | Science Fiction | NULL |
| 6 | Thriller | NULL |
| 7 | Action | NULL |
| 8 | Romantic Comedy | NULL |
Sekiz satır mevcut, bu nedenle bir sonraki oluşturulacak kimlik 9 olmalıdır. Şimdi kategoriler tablosuna yalnızca adını vererek yeni bir kategori ekleyelim.
INSERT INTO `categories` (`category_name`) VALUES ('Cartoons');
Yukarıdaki betiği myflixdb'de çalıştırmak MySQL tezgâh bize aşağıda gösterilen sonuçları verir.
| category_id | category_name | remarks |
|---|---|---|
| 1 | Comedy | Movies with humour |
| 2 | Romantic | Love stories |
| 3 | Epic | Story acient movies |
| 4 | Horror | NULL |
| 5 | Science Fiction | NULL |
| 6 | Thriller | NULL |
| 7 | Action | NULL |
| 8 | Romantic Comedy | NULL |
| 9 | Cartoons | NULL |
Kategori kimliğini belirtmediğimizi lütfen unutmayın. MySQL Kategori kimliği otomatik artan olarak tanımlandığı için otomatik olarak oluşturuldu.
Tarafından oluşturulan son ekleme kimliğini almak istiyorsanız MySQLBunu yapmak için LAST_INSERT_ID işlevini kullanabilirsiniz. Aşağıda gösterilen komut dosyası, oluşturulan son kimliği alır.
SELECT LAST_INSERT_ID();
Yukarıdaki komut dosyasını çalıştırmak, INSERT sorgusu tarafından oluşturulan son otomatik artan sayıyı verir. Sonuçlar aşağıda gösterilmiştir.
Bahşiş: LAST_INSERT_ID() işlevi yalnızca sizin bağlantınızla sınırlıdır, bu nedenle başka bir kullanıcının ekleme işlemiyle oluşturulan bir değer size yanlışlıkla asla döndürülemez.
AUTO_INCREMENT Başlangıç Değerini Ayarlama veya Sıfırlama
Varsayılan sıra 1'den başlar, ancak bu her zaman bir projenin ihtiyacı olan şey değildir. Fatura numaralarının eski bir sistemden devam etmesi gerekebilir ve test tablosunun sıklıkla sıfırlanması gerekebilir. MySQL Sayaç doğrudan açığa çıkarılır, bu nedenle her iki durum da tek bir maddeyle ele alınır. Başlangıç numarasını kontrol etmek için şu adımları izleyin.
- Değeri oluşturma sırasında ayarlayın. CREATE TABLE ifadesine AUTO_INCREMENT yan tümcesini ekleyin. Eklenen ilk satır, 1 yerine bu sayıyı alır.
- Mevcut bir tablodaki değeri değiştirin. Kullanım TABLOYU DEĞİŞTİR Aynı maddeyle. MySQL Yeni numara, yalnızca şu anda saklanan en büyük tanımlayıcıdan daha yüksekse kabul edilir.
- Boşalttığınız bir tabloyu sıfırlayın. TRUNCATE TABLE komutu, tüm satırları siler ve sayacı tek bir işlemde 1'e döndürür; DELETE komutu tek başına bunu yapmaz.
- Değişikliği onaylayın. Yeni sıra numarasına güvenmeden önce bir satır ekleyin ve LAST_INSERT_ID() fonksiyonu ile tanımlayıcıyı geri okuyun.
-- Start a brand-new table at 1000 CREATE TABLE `invoices` ( `invoice_id` int UNSIGNED NOT NULL AUTO_INCREMENT, `amount` decimal(10,2), PRIMARY KEY (`invoice_id`) ) AUTO_INCREMENT = 1000; -- Move the counter on an existing table ALTER TABLE `categories` AUTO_INCREMENT = 100; -- Empty the table and reset the counter to 1 TRUNCATE TABLE `categories`;
Adım boyutu, auto_increment_increment sistem değişkeniyle de değiştirilebilir, ancak bu, tek bir tablo yerine tüm sunucu için geçerlidir. Esas olarak, iki sunucunun aynı tanımlayıcıyı üretmemesi gereken çoğaltma işlemlerinde kullanılır.
AUTO_INCREMENT dizisinde neden boşluklar oluşur?
Er ya da geç bir tabloda 1, 2, 5, 6 gibi tanımlayıcılar görünür. Hiçbir şey bozulmaz. Sayaç, kesintisiz bir sayı dizisi garanti etmek için değil, benzersizliği garanti etmek için tasarlanmıştır ve asla aynı değeri iki kez vermez.
Aşağıdaki nedenlerden dolayı boşluklar oluşur.
- Silinen satırlar: Bir tablodan bir satır silindiğinde, otomatik olarak artırılan kimlik numarası yeniden kullanılmaz. MySQL ardışık olarak yeni sayılar üretmeye devam ediyor.
- Geri alınan işlemler: Numara, ekleme işlemi çalıştığı anda kullanılır. İşlem geri alınırsa, satır kaybolur ancak numara zaten kullanılmış olur.
- Başarısız eklemeler: UNIQUE kısıtlaması tarafından reddedilen bir ifade, başarısız olmadan önce yine de bir tanımlayıcıyı kullanabilir.
- Toplu ek parçalar: InnoDB, çok satırlı ekleme işlemleri için bir sayı bloğunu ayırabilir ve kullanmadığı sayıları atabilir.
Bu boşlukları kapatmaya çalışmak bir hatadır. Satırları yeniden numaralandırmak, onlara işaret eden tüm yabancı anahtarları bozar ve değerin kendisinin hiçbir iş anlamı yoktur. Bir raporun sürekli bir listeye ihtiyacı varsa, depolanmış verileri yeniden yazmak yerine sorguda satır numarasını oluşturun.

