Мне нравится использовать 16-символьный базовый-60 varchar для моих случайных первичных ключей. Вот крошечный столик:
mysql> create table foo (k varchar(16), v varchar(255), primary key(k));
... и вот небольшой элементарный PHP, который будет нажимать на функцию k (), пока не найдет неиспользуемый ключ.
<?php
require_once 'connect.php';
$v = 'A value that needs a unique random key.';
while (!mysql_query("INSERT INTO foo VALUES ('" . k() . "', '$v')")) {};
function k() {
$t = "0123456789ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
$r = "";
for ($i = 0; $i < 16; $i++) {
$r .= substr($t, rand(0, 59), 1);
}
return $r;
}
?>
Вероятность столкновения невелика - от 60 до 16 - поэтому k () почти никогда не вызывается дважды. Бонус: если мне когда-нибудь понадобится увеличить этот ключ, то это varchar, поэтому я могу добавлять байты, не удаляя все, что уже есть в таблице.