2012-04-25 23 views
5

her kayıt için benzersiz ZAMAN alabilir miyimBen <p></p> Ben örnek bir tablo oluşturdu .. ?? MySQL her kayıt için benzersiz bir zaman damgası değerini alma olasılığı var mıdır MySQL

CREATE TABLE t1 (id int primary key, name varchar(50), 
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); 

ve bazı örnek INSERTIONS koştu ve zaman damgası değerler çoğaltılmış gibi görünüyor.

e.g insert into t1(id,name) values(1,"test"); 
+3

Kayıtların aynı anda eklenmesini engellediğiniz sürece, yinelenen zaman damgaları olabilir. –

+1

@MichaelMior Milisaniye vb. Kullanarak "TIMESTAMP duyarlılığını" artıramaz mıyım? Marcus Sadece bir seçme sorgusu kullanıyor. çıplak gözle görebiliyorum. –

+0

MySQL, mikrosaniye desteklemiyor (henüz 5.6.4 olacak), böylece bir tamsayı alanına gitmeyi öneririm. – Kostis

cevap

6

Bir gün yakında (5.6.4), MySQL ancak, hatta fraksiyonel saniye benzersiz olması teorik olarak da, onlar ediyorum garanti edilmez, TIMESTAMP sütunlarında fractional seconds sağlayacak en Genellikle benzersiz olur, özellikle MySQL'i tek bir iş parçacığına sınırlandırırsanız.

Geçici olarak sipariş edilen benzersiz bir numaraya ihtiyacınız varsa, bir UUID kullanabilirsiniz. ancak, en yüksek hassasiyet elde sıralamaya bir UUID

004b721a-8f01-11e1-8920-842b2b55ce56 

ilk üç porsiyon zaman oluşur:

45f9b8d6-8f00-11e1-8920-842b2b55ce56 

Ve daha sonra biraz zaman:

SELECT UUID() gibi bir şey verir en azından, bu şekilde SUBSTR() ve CONCAT() kullanarak ilk üç bölümü tersine çevirmeniz gerekir:

SELECT CONCAT(SUBSTR(UUID(), 15, 4), '-', SUBSTR(UUID(), 10, 4), 
    '-', SUBSTR(UUID(), 1, 8)) 

Verim: kodda ayarlamak zorunda kalacak, ancak garantili bir benzersiz zamansal olarak sıralı değer böylece belli ki, varsayılan değer olarak böyle bir işlevi kullanamadı

11e1-8f00-45f9b8d6 

. UUID(), saniyeden çok daha düşük bir seviyede çalışır (saat döngüleri), bu yüzden her aramada benzersizdir ve düşük yüke sahiptir (auto_increment gibi kilitleme yoktur).

Veritabanı sunucunuz daha merkezi olduğu için, veritabanı sunucusundaki UUID() işlevinin, uygulama sunucusunda PHP'nin microtime() işlevi gibi benzer bir işlevi kullanması tercih edilebilir. Çarpışan değerler oluşturabilen birden fazla uygulama (web) sunucunuz olabilir ve microtime() hala benzersiz değerleri garanti etmez.

+0

+1 harika bilgi. Ancak birkaç soru ortaya çıktı. İlk üç sayı zamansal düzeni nasıl garanti eder? Manuel sadece belirsiz diyor: "İlk üç sayı bir zaman damgası üretilir." Tam 'UUID' daima kullanılmalı mı (sipariş için sadece ilk üç değer tersine çevrilmiş)? Bu işlev hakkında daha fazla bilgi nerede bulunur. Manuel "en yüksek hassasiyetle en az" siparişten söz etmedi mi? –

+0

@ ZZ-bb, MySQL el kitabında kullanıldıkları UUID biçimi bir [standart] olduğundan (http://pubs.opengroup.org/onlinepubs/9629399/toc.pdf) ayrıntıları içermez. UUID'nin dördüncü kısmı saati geri ayarladığınızda değişecektir. Bu, bir bütün olarak değerin benzersiz olmasını sağlamaktır. Saatinle dalga geçmediğin sürece, ilk üç bölüm iyi. –

2

Bir saniyede iki veya daha fazla ekleme veya düzenleme yapmazsanız, evet. Tek sorun, bir çok şey bir ikinci, yani çoklu ekler veya bir where maddesini kullanarak otomatik güncellemeler sırasında yapılabilir. Bu, benzersiz zaman damgalarını zorlamak için basit çözümü göz ardı eder: timestamp sütununa unique kısıtlaması eklemek.

Neden bir timestamp özgün olmalıdır? Eğer timestamp daha hassas zaman değerlerini gerekiyorsa vb

benzersiz bir dizin gerekirse başka auto increment falan kullanın bkz:

+0

açıklayıcı cevap için teşekkürler. Otomatik artış, sorunum için çalışmayacak. Bir güncelleme sorgusu yürütüldüğünden. Sonra kayıtların sırasının değiştiğini tespit edemiyorum. Bu yüzden bir TIMESTAMP kullanmayı denedim. –

+0

@Ashan 'AI' kayıtlarını eklerken siparişi verir. Ancak düzenleme farklı bir hikaye. Sipariş konuları neden düzenlenir? "Zaman damgasının" ana işlevinin, satırda yapılan değişikliklerin zamanını işaretlemesi gerektiğine inanıyorum, böylece satırın ekleme işleminden sonra değiştiğini veya değişmediğini biliyorsunuz. Değişikliklerin sırasını ortaya çıkarmak değil. 'Microtime'ı bir sütuna saklamak bir cevap olabilir ama bu değerin bile her zaman benzersiz olduğunu gösteren bir garanti olmadığını düşünüyorum. "Date" veya "timestamp" + mevcut tarihin düzenlemelerinin bir çeşit sayma değerini ekleyebilirsiniz. Ancak yine de, düzenlemeleri nasıl takip edelim? –

İlgili konular