Генерацыя выпадковых і унікальную радок сімвалаў, выкарыстоўваючы 8 MySQL

Я працую над гульнёй, якая ўключае ў сябе транспартныя сродкі ў нейкі момант. У мяне ёсць табліца MySQL з імем «транспартныя сродкі», якія змяшчаюць дадзеныя аб транспартных сродках, уключаючы калонку «талерку», якая захоўвае нумарныя знакі для транспартных сродкаў.

Зараз тут ідзе частка ў мяне ўзнікаюць праблемы з. Мне трэба знайсці невыкарыстоўваны нумарны знак перад стварэннем новага аўтамабіля - ён павінен быць літарна-лічбавы 8-голец выпадковая радок. Як я дасягнуў гэтага выкарыстаў час цыклу ў Lua, які з'яўляецца мовай праграмавання я ў, для генерацыі радкоў і запытаў БД, каб убачыць, калі ён выкарыстоўваецца. Аднак, паколькі колькасць аўтамабіляў павялічваецца, я чакаю, што гэта стане яшчэ больш неэфектыўным гэта прама цяпер. Таму я вырашыў паспрабаваць і вырашыць гэтую праблему з дапамогай запыту MySQL.

The query I need should simply generate a 8-character alphanumeric string which is not already in the table. I thought of the generate&check loop approach again, but I'm not limiting this question to that just in case there's a more efficient one. I've been able to generate strings by defining a string containing all the allowed chars and randomly substringing it, and nothing more.

Любая дапамога вітаецца.

66
@YaK Глядзіце мой адказ пра тое, як пазбегнуць нават маленечкую магчымасць сутыкнення
дададзена аўтар Eugen Rieck, крыніца
Як выпадковыя вам трэба, каб яны былі? Калі хтосьці атрымлівае пэўны нумарны знак, гэта важна ці не, ці могуць яны працаваць на наступны ці папярэдні нумарны знак, што вы раздавалі?
дададзена аўтар Damien_The_Unbeliever, крыніца

16 адказы

Гэтая праблема складаецца з двух вельмі розных подзадач:

  • радок павінна быць на першы погляд выпадковыя
  • радок павінна быць унікальнай

У той час як хаатычнай даволі лёгка дасягаецца, унікальнасць без паўтарэння цыкла няма. Гэта падводзіць нас засяродзіцца на унікальнасць першага. Невыпадковы унікальнасць можа трывіяльна быць дасягнута з дапамогай AUTO_INCREMENT . Такім чынам, выкарыстоўваючы унікальнасць якія захоўваюць, псеўдавыпадковых пераўтварэнне было б добра:

  • Hash было прапанавана @paul
  • AES-шыфраванне падыходзіць таксама
  • Але ёсць добры адзін: RAND (N) сам

Паслядоўнасць выпадковых лікаў, створаных адным і тым жа семені гарантавана будзе

  • Узноўленая
  • розныя для першых 8 ітэрацый
  • калі насеньне з'яўляецца INT32

Такім чынам, мы выкарыстоўваем @ AndreyVolk-х ці @ падыход GordonLinoff, але з <�моцны> адабраны RAND :

напрыклад Assumin ідэнтыфікатар з'яўляецца AUTO_INCREMENT Col:

INSERT INTO vehicles VALUES (blah); -- leaving out the number plate
SELECT @lid:=LAST_INSERT_ID();
UPDATE vehicles SET numberplate=concat(
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@lid)*4294967296))*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed)*36+1, 1)
             )
     WHERE [email protected];
64
дададзена
Я маю намер гэта LCG? Чаму вы абралі менавіта гэтыя лічбы, у прыватнасці? @Eugen Rieck. Дзякуй!
дададзена аўтар Mick, крыніца
Мне было проста цікава. Чаму вы выкарыстоўваеце гэтыя лічбы ..4294967296)) * 36 + 1?
дададзена аўтар Mick, крыніца
@PaulSpiegel 1. Вось чаму я назваў яго «здавалася б, выпадковым чынам». 2. Гэта, вядома, быць ecpected, што сутыкненні адбываюцца, калі вы выкарыстоўваеце толькі 3 лічбы. Калі вы выкарыстоўваеце 8 лічбаў, ніякіх сутыкненняў не адбудзецца ў першыя 2 ^ 32 ітэрацый.
дададзена аўтар Eugen Rieck, крыніца
4294967296 = 2 ^ 32 - Семя павінна быць у Int32, у RAND() функцыя выдае значэнне паміж 0 і 1, так што 4294967296 * Rand (Somthing) дасць нам выпадковую 32-бітны INT, які падыходзіць у якасці наступнага насення.
дададзена аўтар Eugen Rieck, крыніца
@YaK Дзякуй! Тое, што я Мент (і налева, калі капіраванне ўстаўка з няправільнай версіі) была @seed: = круглая (RAND (@seed) * 4294967296)
дададзена аўтар Eugen Rieck, крыніца
Вельмі межжала падыход, але вы, верагодна, меў на ўвазе RAND (LAST_INSERT_ID ()); UPDATE транспартных сродкаў (...), RAND() * 36 + 1, (...) (ці ж ён вяртаецца ў 8 разоў адзін і той жа знак). Як мы можам быць упэўнены, што 8 паслядоўныя выклікі рандаў() гарантавана вяртае іншую паслядоўнасць, калі ініцыялізаваны з рознымі насеннем?
дададзена аўтар RandomSeed, крыніца
Вы не можаце назваць выпадковай паслядоўнасці, калі ён з'яўляецца прайграваных. І дублікаты таксама магчымыя, таму што вы карыстаецеся паверха() . Гэта sqlfiddle паказвае, што дублікаты ствараюцца тры знакавых доўгіх радкоў.
дададзена аўтар Paul Spiegel, крыніца
@EugenRieck Я не разумею, як вы атрымліваеце вашыя нумары ( «першыя 2 ^ 32 ітэрацый»). Але мне трэба толькі адзін прыклад дубляў абвергнуць гэтую канцэпцыю. Для ідэнтыфікатараў 193844 і 775771 ваш алгарытм будзе генераваць тую ж радок T82X711 ( дэма ).
дададзена аўтар Paul Spiegel, крыніца
Гэта прасцей пры пасеве слупок: SUBSTRING (MD5 (RAND ()) З 1 ПА 8) проста змяніць 8 для любой даўжыні вам трэба. Калі адбываецца сутыкненне проста паўторна запусціць запыт, у гэтым дадатку (верагодна высяванне пустога слупка, перш чым зрабіць яго унікальным) паўторна запусціць не будзе рабіць ніякіх пашкоджанняў. 90% з вас будзе мець патрэбу ў гэтым, але вышэй адказ не вырашыць для унікальнай памылкі няма.
дададзена аўтар Paul Kenjora, крыніца
@EugenRieck што «мля» у першым радку? што я павінен паставіць там?
дададзена аўтар Lam, крыніца
Зроблена гэта прынята адказваць, як, хоць я вырашыў змяніць падыход, гэты адказ працоўнага адказ на гэтае пытанне. Дзякуй!
дададзена аўтар funstein, крыніца
Гэта крыху стары, але я хацеў бы адзначыць, што я павінен быў дадаць FLOOR() вакол параметраў другі падрадка: ... падрадок ( "ABC ... 789 », пол (ранд (@seed: = ...) * 36 + 1), 1), ... у некаторых выпадках, падрадок спрабуе выбраць сімвал 36.9, які пры акругленні да 37, прывядзе ні адзін знак не выбіраецца.
дададзена аўтар Phillip Dodson, крыніца

Як я ўжо казаў у маім каментары, я woudn't затлумляцца з верагоднасцю сутыкнення. Проста генераваць выпадковую радок і праверыць, калі ён існуе. Калі гэта адбудзецца, паспрабуйце яшчэ раз, і вы не павінны рабіць гэта больш, што пару разоў, калі ў вас ёсць вялікая колькасць пласцін ужо прызначаныя.

Іншым рашэнне для генеравання 8-сімвала доўгай псеўдавыпадковых радкі ў чыстым (My) SQL:

SELECT LEFT(UUID(), 8);

Вы можаце паспрабаваць наступнае (псеўда-код):

DO 
    SELECT LEFT(UUID(), 8) INTO @plate;
    INSERT INTO plates (@plate);
WHILE there_is_a_unique_constraint_violation
-- @plate is your newly assigned plate number
60
дададзена
Я бачу, дзякуй @jchook
дададзена аўтар Martin AJ, крыніца
Я хачу, каб згенераваць 9 сімвалаў даўжынёй выпадковай радкі, і, калі я выкарыстоўваю 9 у кодзе SELECT левы (UUID (), 9); , заўсёды ёсць <�код > - у канцы радка, генераванай ў якасці дзевятага знака. Яна сталая. Чаму?
дададзена аўтар Martin AJ, крыніца
Калі ласка, звярніце ўвагу, што першыя 8 сімвалаў UUID не з'яўляецца выпадковым, але паслядоўным, так як яна заснаваная на часовай пазнакі.
дададзена аўтар ADTC, крыніца
@ User3099183 Афіцыйна , "вельмі нізкі" , 16 ^ 8 складае каля 4 мільярдаў магчымых радкоў.
дададзена аўтар RandomSeed, крыніца
@MartinAJ, таму што радок з'яўляецца UUID . Вы можаце лёгка замяніць злучок, напрыклад, <�Код> SELECT левы (REPLACE (UUID (), '-', ''), 16);
дададзена аўтар jchook, крыніца
Дзякуй за ваша рашэнне я адно пытанне аб UUID. колькі шанцаў ідэнтыфікатар вы генераваць 8 знакаў зноў паўтарыць.
дададзена аўтар TR-Ahmed, крыніца

Як наконт разліку MD5 (ці іншы) Хэш паслядоўных цэлых лікаў, то, прымаючы першыя 8 знакаў.

г.зн.

MD5(1) = c4ca4238a0b923820dcc509a6f75849b => c4ca4238
MD5(2) = c81e728d9d4c2f636f067f89cc14862c => c81e728d
MD5(3) = eccbc87e4b5ce2fe28308fd9f2a7baf3 => eccbc87e

і г.д.

Засцярога: Я паняцця не маю, колькі вы маглі б вылучыць да сутыкнення (але гэта было б вядома і пастаяннае значэнне).

Рэдагаванне: Гэта цяпер стары адказ, але я бачыў яго зноў з часам на маіх руках, таму, ад назірання ...

Верагоднасць ўсіх лікаў = 2,35%

Верагоднасць ўсіх літар = 0,05%

Першае сутыкненне, калі MD5 (82945) = "7b763dcb ..." (такі ж вынік, як MD5 (25302))

48
дададзена
Гэта, вядома, толькі цацка выпадковасці.
дададзена аўтар Keelan, крыніца
Гэта не выпадкова на ўсіх.
дададзена аўтар paul, крыніца
Існуе верагоднасць таго, што гэта можа прывесці толькі з лікамі
дададзена аўтар Mladen Janjetovic, крыніца
Вы маглі б зрабіць яго больш «выпадковым», калі замест выкарыстання аўтаматычнага Інкрыментны ідэнтыфікатара, можна выкарыстоўваць DateTime, у якім была зробленая ўстаўка, якая таксама з'яўляецца ўнікальнай.
дададзена аўтар Javier La Banca, крыніца
Добрая ідэя, можа выкарыстоўваць яго па першасным ключу. Ці будзе мець гэта на ўвазе, для будучых праектаў, дзякуй!
дададзена аўтар funstein, крыніца

Вось адзін са спосабаў, з дапамогай альфа-лічбамі, дапушчальныя сімвалы:

select concat(substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*36+1, 1)
             ) as LicensePlaceNumber;

Звярніце ўвагу, што няма ніякай гарантыі унікальнасці. Вы павінны праверыць, што асобна.

20
дададзена
выкарыстоўваць слова (рандаў() * 36 + 1) замест гэтага. У адваротным выпадку некаторыя вынікі будуць «кароткімі».
дададзена аўтар Fraggle, крыніца
там павінна быць 35 + 1 не 36 + 1! У адваротным выпадку вы атрымаеце некаторыя некалькі радкоў з 8 знакаў і некаторыя з іх з 7
дададзена аўтар BIOHAZARD, крыніца

<�Моцны> Стварыць выпадковая радок

Вось функцыя MySQL, каб стварыць выпадковую радок зададзенай даўжыні.

DELIMITER $$

CREATE DEFINER=`root`@`%` FUNCTION `RandString`(length SMALLINT(3)) RETURNS varchar(100) CHARSET utf8
begin
    SET @returnStr = '';
    SET @allowedChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    SET @i = 0;

    WHILE (@i < length) DO
        SET @returnStr = CONCAT(@returnStr, substring(@allowedChars, FLOOR(RAND() * LENGTH(@allowedChars) + 1), 1));
        SET @i = @i + 1;
    END WHILE;

    RETURN @returnStr;
END

Выкарыстанне SELECT RANDSTRING (8) , каб вярнуць радок 8 знакаў.

Вы можаце наладзіць @allowedChars .

Унікальнасць не гарантуецца - як вы ўбачыце ў каментарах да іншых рашэнням, гэта проста не магчыма. Замест гэтага вам трэба стварыць радок, праверце, калі ён ужо выкарыстоўваецца, і паспрабуйце ізноў, калі яна ёсць.


<�Моцны> Праверце, калі выпадковая радок ўжо выкарыстоўваецца

Калі мы хочам захаваць сутыкнення праверкі кода з прыкладання, мы можам стварыць трыгер:

DELIMITER $$

CREATE TRIGGER Vehicle_beforeInsert
  BEFORE INSERT ON `Vehicle`
  FOR EACH ROW
  BEGIN
    SET @vehicleId = 1;
    WHILE (@vehicleId IS NOT NULL) DO 
      SET NEW.plate = RANDSTRING(8);
      SET @vehicleId = (SELECT id FROM `Vehicle` WHERE `plate` = NEW.plate);
    END WHILE;
  END;$$
DELIMITER ;
17
дададзена
вельмі добра працуе функцыя
дададзена аўтар John, крыніца
гэта павінна быць прынята рашэнне, відавочна, і да кропкі, працаваў вельмі добра для мяне, дзякуй @ Пэдді-ман
дададзена аўтар Saif, крыніца
Праца добра ++ правільны адказ
дададзена аўтар Thiago Natanael, крыніца

Вы можаце выкарыстоўваць рандаў() ў MySQL і сімвал() функцыя:

select concat( 
    char(round(rand()*25)+97),
    char(round(rand()*25)+97),
    char(round(rand()*25)+97),
    char(round(rand()*25)+97),
    char(round(rand()*25)+97),
    char(round(rand()*25)+97),
    char(round(rand()*25)+97),
    char(round(rand()*25)+97)
) as name;
13
дададзена

Вы можаце генераваць выпадковыя літарна-лічбавы радок:

lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0);

Вы можаце выкарыстоўваць яго ў ПЕРАД INSERT трыгерам і праверыць дублікат у цыкле ў той час:

CREATE TABLE `vehicles` (
    `plate` CHAR(8) NULL DEFAULT NULL,
    `data` VARCHAR(50) NOT NULL,
    UNIQUE INDEX `plate` (`plate`)
);

DELIMITER //
CREATE TRIGGER `vehicles_before_insert` BEFORE INSERT ON `vehicles`
FOR EACH ROW BEGIN

    declare str_len int default 8;
    declare ready int default 0;
    declare rnd_str text;
    while not ready do
        set rnd_str := lpad(conv(floor(rand()*pow(36,str_len)), 10, 36), str_len, 0);
        if not exists (select * from vehicles where plate = rnd_str) then
            set new.plate = rnd_str;
            set ready := 1;
        end if;
    end while;

END//
DELIMITER ;

Цяпер проста ўвядзіце вашыя дадзеныя, як

insert into vehicles(col1, col2) values ('value1', 'value2');

І трыгер будзе генераваць значэнне для пласціны калонцы.

( sqlfiddle дэма )

Гэта працуе такім чынам, калі слупок дапускае значэнне NULL. Калі вы хочаце быць NOT NULL вам трэба будзе вызначыць значэнне па змаўчанні

`plate` CHAR(8) NOT NULL DEFAULT 'default',

Вы таксама можаце выкарыстоўваць любы іншы алгарытм генерацыі выпадковых радкоў у трыгер, калі вялікія лацінскія літары і лічбы не тое, што вы хочаце. Але трыгер будзе клапаціцца аб адзінасці.

11
дададзена
Вы пане геній. Я мяркую, дадаючы маленькія літары немагчыма з-за адсутнасці пераемнасці сымбаляў? (91-96) Не тое, што мне гэта трэба, проста цікава ...
дададзена аўтар Akxe, крыніца
Дзіўна! Гэта менавіта тое, што я хацеў. Я толькі хацеў бы, каб зразумець, як ён пераўтворыцца ў радок. Чаму там бац, што рабіць, каб дадаць нумары і гэтак далей. Ва ўсякім выпадку, дзякуй.
дададзена аўтар Akxe, крыніца
@Akxe ко() падтрымлівае толькі базу да 36 (10 + 26 лічбаў вялікіх літар). Калі вы хочаце ўключыць малыя літары, то патрэбен іншы спосаб, каб пераўтварыць лік у радок.
дададзена аўтар Paul Spiegel, крыніца
@Akxe ко() можна выкарыстоўваць для пераўтварэння лікі ў літарна-лічбавы радок. <�Код> Паў (36,8) -1 гэта лікавае паданне ZZZZZZZZ . Такім чынам, мы генеруючы выпадковы лік паміж 0 і '36 ^ 8-1 '(ад 0 у 2821109907455 ) і пераўтварыць яго ў алфавітна-лічбавая радок паміж 0 і ZZZZZZZZ unsing Конвей() . Лапад() запоўніць радок з нулі, пакуль яна не мае даўжыню 8.
дададзена аўтар Paul Spiegel, крыніца

Вось яшчэ адзін спосаб для генерацыі выпадковай радкі:

<�Код> SELECT SUBSTRING (MD5 (RAND ()) З 1 ПА 8) myrandomstring

6
дададзена

Выкарыстоўваем дадзеныя з іншага слупка, каб сфармаваць «хэш» або унікальную радок

UPDATE table_name SET column_name = Right( MD5(another_column_with_data), 8 )
3
дададзена
Там няма граніту, каб атрымаць унікальныя вынікі.
дададзена аўтар Mahdi Rafatjah, крыніца
Гэта працуе выдатна. Дзякуй.
дададзена аўтар studio-klik, крыніца

Для генерацыі выпадковай радкі, вы можаце выкарыстаць:

<�Код> SUBSTRING (MD5 (RAND ()) З 1 на працягу 8)

Вы Атрымліваць нешта накшталт гэтага:

<�Код> 353E50CC

2
дададзена

Калі вы не маеце ідэнтыфікатар ці насеньне, як і яго ІТС для спісу значэнняў у ўстаўкі:

REPLACE(RAND(), '.', '')
1
дададзена

8 літар з алфавіту - усё загалоўныя літары:

UPDATE `tablename` SET `tablename`.`randomstring`= concat(CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25)))CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25))));
1
дададзена

Прымаючы пад увагу агульная колькасць сімвалаў, якія вы патрабуеце, вы б вельмі невялікі шанец стварэння двух дакладна такое ж колькасць пласцін. Такім чынам, вы, верагодна, можа сысці з генерацыі лікаў у LUA.

У вас ёсць 36 ^ 8 розных унікальных нумарныя (2.821.109.907.456, гэта вельмі шмат), нават калі ў вас ужо мільён нумарныя ўжо, вы б вельмі маленькі шанец фарміравання аднаго ў вас ужо ёсць, каля 0,000035%

Вядома, усё гэта залежыць ад таго, колькі нумарных вы будзеце ў канчатковым выніку стварэнне.

1
дададзена
Праўда, я буду працягваць гэта рабіць у рэальнай гульні замест SQL. Вялікі дзякуй.
дададзена аўтар funstein, крыніца

Для радкі, якая складаецца з 8 выпадковых лікаў і вялікіх і малых літар, гэта маё рашэнне:

LPAD(LEFT(REPLACE(REPLACE(REPLACE(TO_BASE64(UNHEX(MD5(RAND()))), "/", ""), "+", ""), "=", ""), 8), 8, 0)

Тлумачэння ад навыварат:

  1. RAND generates a random number between 0 and 1
  2. MD5 calculates the MD5 sum of (1), 32 characters from a-f and 0-9
  3. UNHEX translates (2) into 16 bytes with values from 00 to FF
  4. TO_BASE64 encodes (3) as base64, 22 characters from a-z and A-Z and 0-9 plus "/" and "+", followed by two "="
  5. the three REPLACEs remove the "/", "+" and "=" characters from (4)
  6. LEFT takes the first 8 characters from (5), change 8 to something else if you need more or less characters in your random string
  7. LPAD inserts zeroes at the beginning of (6) if it is less than 8 characters long; again, change 8 to something else if needed
1
дададзена
Выдатна, менавіта тое, што я шукаў, каб стварыць маркер тыпу ID першапачаткова ў MySQL
дададзена аўтар rabudde, крыніца
DELIMITER $$

USE `temp` $$

DROP PROCEDURE IF EXISTS `GenerateUniqueValue`$$

CREATE PROCEDURE `GenerateUniqueValue`(IN tableName VARCHAR(255),IN columnName VARCHAR(255)) 
BEGIN
    DECLARE uniqueValue VARCHAR(8) DEFAULT "";
    WHILE LENGTH(uniqueValue) = 0 DO
        SELECT CONCAT(SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
                SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1)
                ) INTO @newUniqueValue;
        SET @rcount = -1;
        SET @query=CONCAT('SELECT COUNT(*) INTO @rcount FROM  ',tableName,' WHERE ',columnName,'  like ''',@newUniqueValue,'''');
        PREPARE stmt FROM  @query;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    IF @rcount = 0 THEN
            SET uniqueValue = @newUniqueValue ;
        END IF ;
    END WHILE ;
    SELECT uniqueValue;
    END$$

DELIMITER ;

Выкарыстоўвайце гэтую зберажоную працэдуру і выкарыстоўваць яго кожны раз, як

Call GenerateUniqueValue('tableName','columnName')
0
дададзена