更新トリガーソリューションの前:
次のコマンドを使用して、6文字のランダムな英数字の大文字の文字列を作成できます。
lpad(conv(floor(rand()*pow(36,6)), 10, 36), 6, 0);
既存の文字列を作成しないために、BEFORE UPDATE
を使用できます。 引き金。
DELIMITER //
CREATE TRIGGER `unique_codes_before_update`
BEFORE UPDATE ON `unique_codes` FOR EACH ROW
BEGIN
declare ready int default 0;
declare rnd_str text;
if new.CODE is null then
while not ready do
set rnd_str := lpad(conv(floor(rand()*pow(36,6)), 10, 36), 6, 0);
if not exists (select * from unique_codes where CODE = rnd_str) then
set new.CODE = rnd_str;
set ready := 1;
end if;
end while;
end if;
END//
DELIMITER ;
CODE
を設定するたびに 列からNULL
UPDATE
で ステートメントの場合、トリガーは、テーブルに一致するものが見つからなくなるまで、ループ内に新しいランダムな文字列を作成します。
これで、すべてのNULL値を次のように置き換えることができます:
update unique_codes set CODE = NULL where code is NULL;
SQLFiddleデモはこちら 1文字のランダムな文字列を使用して、値が重複していないことを示します。
BEFORE INSERT
でも同じコードを使用できます 引き金。このようにして、CODE=NULL
で新しい行を挿入できます。 トリガーはそれを新しい一意のランダムな文字列に設定します。また、再度更新する必要はありません。
元の回答(32文字の文字列):
select lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0) as rnd_str_8;
-- output example: 3AHX44TF
8文字の英数字の大文字のランダムな文字列を生成します。それらのうちの4つを連結して、32文字を取得します。
select concat(
lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0),
lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0),
lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0),
lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0)
) as rnd_str_32;
-- output example: KGC8A8EGKE7E4MGD4M09U9YWXVF6VDDS
http://sqlfiddle.com/#!9/9eecb7d/76933
では、ユニクネスはどうですか?ええと-重複を生成してみてください;-)