MySQL Benzersiz karma ekleme

4 Cevap php

Yani, birkaç basit sütun, bir otomatik artış, ve bir karma (varchar, TEK) ile bir mysql tablo düşünün.

Bu MySQL bir sütun katacak bir sorgu vermek ve birden fazla sorgu olmadan benzersiz bir karma oluşturmak mümkün mü?

Şu anda, bunu başarmak için aklıma tek yolu ben daha girişleri db vardı yoğun daha ve daha fazla işlemci olacak endişe bir süre, ile.

İşte bazı sözde-php, açıkçası denenmemiş, ama genelinde genel bir fikir alır:

while(!query("INSERT INTO table (hash) VALUES (".generate_hash().");")){
    //found conflict, try again.
}

Yukarıdaki örnekte, karma kolon benzersiz olacaktır ve bu nedenle, sorgu başarısız olur. Sorun, db 500.000 girişleri var diyorlar ve ben 4 karakter ile, bir base36 karma jeneratör kapalı çalışıyorum. Bir çatışma olasılık vardır neredeyse 1 3 olacağını, ve ben kesinlikle 160.000 sorguları çalışan olamaz. Aslında 5 daha fazla bir ben kabul edilemez düşünecektim.

Yani, saf SQL ile bunu yapabilirsiniz? (: "J8Du7X", az, AZ, 0-9 ve chars gibi), ve ya onunla last_insert_id güncellemek, hatta daha iyi, insert sırasında oluşturmak I 6 karakter dize, bir base62 oluşturmak gerekir.

MySQL ile temel CRUD işleyebilir, ama bile Joın benim MySQL konfor bölgesi biraz dışında, yani bu pasta ise benim cehalet mazeret.

Herhangi bir fikir? Ben saf MySQL veya PHP & ya da kullanmayı tercih ediyorum Başka bir dil bu temiz halletmek eğer MySQL, ama cehennem, ben de bir senaryo ve AJAX onu kurmak istiyorum.

Teşekkürler!

4 Cevap

Kalp base-36 4 karakter sağlamalarının kullanarak ayarlanmış ise (hashspace sadece 1.679.616 olan), muhtemelen diğer tablodaki değil zaten karma bir tablo pre-yaratacaktır. Sonra benzersiz bir karma bulma O (1) 'dir "kullanılan tablo" için "kullanılmayan masa" onu hareketli olarak basit olacaktır.

Masa makul 1/3 ise tam size muhtemelen ömür boyu dolmaya beri hashspace genişleyen düşünebilirsiniz. Alan dolduğunda artık olursa olsun kullanmak ne algoritma benzersiz karmalar bulmak mümkün olacak.

Bu karma bir karma nedir? Sadece rastgele oluşturulan benzersiz VARCHAR sütunu istediğiniz gibi görünüyor? Ne otomatik artış nesi var?

Fazla 4 karakter ile, veya bir UUID jeneratör (aslında bir şey karma eğer), ve evet, bir while döngüsü kullanabilirsiniz, ama sadece büyük bir oluşturmak - MD5 fonksiyonu bulmak - Her neyse, sadece bir büyük karma kullanmalısınız yeterli bir çatışmalar tesadüfen böylece

Diğerleri bir autoinc alanı ile ne yanlış önerilen gibi? Bir alfa nümerik bir değer istiyorsanız o zaman sadece int tabanının 36 bir alfanümerik dize basit bir dönüşüm yapabilirdi. Bu hemen hemen her dilde uygulanabilir.

Zneaks açıklama ile gitmek, neden bir değiştirmemesi sütunu kullanmak değil mi? başka bir (non benzersiz) alanında karma kaydetmek ve (dinamik) ona id bağlamak. Yani bir kullanıcı [hash] [id] verir. Sen substring fonksiyonları kullanılarak saf sql bunu ayrıştırmak olabilir.

Eğer karma sahip olduğundan, kullanıcı kimliği arttırılmasıyla diğer kayıtlara bakamıyorum.