2008-12-12 13 views
21

Böyle bir otomatik artış sütun ile basit bir tablo düşünün:Otomatik arttırma sütunu tükendiğinde ne olur?

CREATE TABLE foo 
(
    `fooid` bigint unsigned NOT NULL auto_increment, 
    ....snipped.... other columns 
    PRIMARY KEY (`fooid`) 
) 
ENGINE=InnoDB AUTO_INCREMENT=10 

Bunu nasıl yeniden tasarlıyoruz, böylece bigint veri tipinin maksimumuna ulaşmıyoruz? İmzasız aralık 0 ila 18446744073709551615'dir. 18446744073709551615'e ulaşmak ne kadar süreceğini bilmiyorum, ama Y2K problemi gibi, bunun için hazır olmak istiyorum.

cevap

55

Her milisaniyede bir satır eklediğinizi varsayalım.

18446744073709551615 millseconds = 18446744073709552 saniye = 307445734561826 dakika = 5124095576030 saat = 213503982335 gün = 584942417 yıl

Yani

Bir milyon eklemek olabilir gerçekten Y2K sorunu gibi değil Milisaniye başına satır ve hala 500 yıldan fazladır. Başka bir deyişle: bunun için endişelenme.

+1

Tamam. Uygulamamın bu kadar uzun süreceğini sanmıyorum => 500 yıl. – ashitaka

+2

Benzer şekilde, yalnızca bir kez bir kez eklerseniz, uygulamanız 68 yıl boyunca 32 bit imzalanmış bir int ile çalışır. Her kayıt için 4 bayt kaydedin ve yapabiliyorsanız 32 bit int kullanın. – jmucchiello

+0

Bunu ikincisiyim. Veri tabanı oluştururken daha fazla önlem gerektiren şeyler vardır. – Tomalak

18

Kullandığınız SQL mode, MySQL, AUTO_INCREMENT sayısal sütunun değeri aralık dışında büyüdüğünde iki şeyden birini yapar. Her iki durumda da bir hata alırsınız, ancak farklı nedenlerle.

katı modda MySQL, aralık dışı değeri reddeder, geçersiz bir değer hatası verir ve INSERT başarısız olur. Varsayılan sıkı olmayan modda MySQL değeri, veri türü için izin verilen en yüksek değere düşürür ve INSERT gerçekleştirir. Ama AUTO_INCREMENT nitelik zaten kullanılacak olası tüm değerleri neden oldu çünkü INSERT başarısız olur ve (işaretsiz SMALLINT örnek) bu hatayı alıyorum: Burada BIGINT Örneğin

MySQL said: 

#1062 - Duplicate entry '65535' for key 1 

, "65535" ile değiştir Bu sorunun bir üretim veritabanında oluşma ihtimali olmamasına rağmen 18 quintillion.

Ama bir uygulamanın ömrü boyunca olası anahtar değerleri (INSERT s sayısı) hafife eğer çok kolayca ortaya çıkabilir TINYINT s ve SMALLINT s ile

. Kodunuzda değişiklik yaptığınızı ve verilerinizin doğru bir şekilde yerleştirildiğini test ettiğinizi düşünün. Aniden uygulamanız yukarıdaki hatayla çalışmayı bırakıyor. Değişiklikleri bilinen iyi koda geri alırsınız, ancak hata gitmeyecek ... çok sinir bozucu.

2

MySQL hakkında bir şey bilmiyorsunuz, ancak Postgresql durumunda, dizinin bir CYCLE/NO CYCLE olup olmadığını belirtebilirsiniz. Bir CYCLE seçeneği ile oluşturulmuşsa, tekrar 1'e (veya minvalue) geri gelir ve çift anahtar için hatayı atar.

+2

MySQL'de mevcut değil. –

İlgili konular