MySQL benzersiz kimliği oluşturmak nasıl?

9 Cevap php

I'm programming a script using PHP and MySQL and I want to get a unique id (consisting of a string: capitals and small letters with numbers) like: gHYtUUi5b. I found many functions in PHP that can generate such numbers but I'm afraid about how to ensure the id is unique!

UPDATE: (P5Dc) 11 alfanümerik karakter: UUID ben gibi bu tür id demek, uzun.

9 Cevap

: A programmatic way olabilir

  • alanına benzersiz bir dizin eklemek
  • PHP rastgele bir dize oluşturmak
  • loop in PHP ( while( ! DO_THE_INSERT ) )
    • Başka bir dize oluşturmak

Note:

  • Bu kirli ama olma avantajına sahip olabilir DBMS-agnostic
  • Even if you choose to use a DBMS specific unique ID generator function (UUID, etc) it is a best practice to assure the field HAS to be UNIQUE, using the index
  • döngü istatistiksel hiç idam değil, sadece uç başarısızlık üzerine girilir

Ben eşsiz bir değer oluşturmak için UUID () kullanın.

Örnek:

insert into Companies (CompanyID, CompanyName) Values(UUID(), "TestUUID");

Bunu biz bunu yolu gibi olabilir. Ben "rastgele"-oldukça yaygın bir sorun baktı geri dönüşümlü bir benzersiz bir kod istedi.

  • Biz 1942 gibi bir giriş numara almak.
  • "0000001942": bir dize içine ped bıraktı
  • Ön üzerine son iki rakamını koyun: "4200000019"
  • Bir dizi içine dönüştürmek: 4200000019

Biz şimdi çılgınca aramalar ve 10000000000 daha az olduğu garantilidir arasında değişen bir dizi var. Değil kötü bir başlangıç.

  • Bir Base 34 dizeye bu sayıyı dönüştürmek: "2oevc0b"
  • 'Y' ve 'z' ile herhangi olanlar ile herhangi sıfırların yerine: "2oevcyb"
  • Vites yükseltme "2OEVCYB"

Biz yaklaşık 0 / O ve 1 / l çarpışmalar üzülmeyin böylece tabanı 34 seçimi için nedenidir. Şimdi size bir UZUN veritabanı tanıtıcısı aramak için kullanabileceğiniz bir kısa rastgele görünümlü anahtarı var.

Kullan UUID function.

Ben benzersiz değerler üretir PHP sizin prosedürlerin kaynağını bilmiyorum. Bu kütüphane fonksiyonu ise onlar değer gerçekten benzersiz olduğunu garanti etmelidir. Belgelerini kontrol edin. Sen, Hovewer, bu fonksiyonu her zaman kullanmak gerekir. Eğer, örneğin, benzersiz bir değer üretmek için PHP işlevini kullanın ve sonra MySQL işlevini kullanmaya karar verirseniz, zaten mevcut değer üretebilir. Bu durumda sütun üzerinde UNIQUE INDEX koyarak da iyi bir fikirdir.

Nasıl unique_ids oluşturmak yararlı bir soru - ama when onları oluşturmak hakkında bir sayaç üretken varsayım yapmak gibi görünüyor!

Benim nokta da sokulmadan verilerin aslında bağımsız çünkü, satır oluşturma zamanda bu benzersiz id üretmek gerek kalmamasıdır.

Ne yapmam ileride kullanmak, benim kendi tatlı zaman ayırın ve kesinlikle onlar eşsiz garanti ve insert zamanda yapılması gereken hiçbir işlem yoktur ki yol id öncesi oluşturmak benzersizdir.

Örneğin ben içinde order_id ile siparişlerinizi tablo var. Kullanıcı sonsuza kadar, aşamalı 1,2,3 vb sipariş girdiğinde bu kimliği anında oluşturulur. Kullanıcı, bu iç kimliği görmek gerekmez.

Sonra başka bir tablo var - (order_id, UNIQUE_ID) ile unique_ids. Ben önümüzdeki 24 saat içinde takılı olabilir siparişleri karşılamak daha her gece yeterli unique_id satır ile hangi önceden yükler bu tabloyu çalışan bir rutin var. (Şimdiye kadar bir günde 10000 emir olsun ben bir sorun var olacak - ama bu olması iyi bir sorun olurdu!)

Bu yaklaşım teklik garanti ve uzak uç işlem gelen ve toplu rutin içine herhangi bir işlem yükünü alır, nerede kullanıcıyı etkilemez.

Aşağıda sadece sayısal benzersiz rastgele id referans içindir ...

size yardımcı olabilir ...

$query=mysql_query("select * from collectors_repair");
$row=mysql_num_rows($query);
$ind=0;
if($row>0)
{
while($rowids=mysql_fetch_array($query))
{
  $already_exists[$ind]=$rowids['collector_repair_reportid'];
}
}
else
{
  $already_exists[0]="nothing";
}
    $break='false';
    while($break=='false'){
      $rand=mt_rand(10000,999999);

      if(array_search($rand,$alredy_exists)===false){
          $break='stop';
      }else{

      }
    }

 echo "random number is : ".$echo;

ve sizin gibi kodla karakter ekleyebilirsiniz -> $rand=mt_rand(10000,999999) .$randomchar; // assume $radomchar contains char;

Ayrıca contraints içinde [neredeyse garantili] benzersiz bir kimlik oluşturmak için crypt() * kullanmayı düşünebilirsiniz.

Teklik için ne yapmam ben Unix zaman damgası almak ve bunun için rastgele bir dize eklemek ve bu kullanmaktır.

Rasgele olması gerekiyor mu? Ya da belki eklediğiniz satırdaki diğer bilgileri kapalı benzersiz id temel olabilir?

Önce birkaç alana 2 birkaç harf tarafından takip alanın 1 mektupları, ve daha sonra bir tamsayı gibi bir şey yapabilirdi.

Yani (tamsayı olmayan, ilk birkaç harf.) PHP ID ilk bölümünü üretecek

Daha sonra yürüterek benzer kimlikleri için veritabanı kontrol edebilir:

SELECT UniqueID FROM someTable WHERE UniqueID LIKE 'generatedString%' ORDER BY UniqueID DESC;

Sonra, ilk satırı kapmak sonunda kapalı tamsayı kapmak, biri bunu artırmak, ve oluşturulan dizenin sonuna kadar o tamsayı eklemek ve eklersiniz.