Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да генерирам уникален, произволен низ за една от колоните на моята MySql таблица?

Решение за задействане ПРЕДИ АКТУАЛИЗИРАНЕ:

Можете да създадете произволен низ от 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 тук използвам произволен низ от един знак, за да демонстрирам, че нито една стойност не се дублира.

Можете също да използвате същия код в 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 знака с главни букви и букви. Свържете четири от тях, за да получите 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

И така, какво ще кажете за уникалността? Добре - опитайте се да генерирате дубликати;-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Свързване с MySQL от Android с JDBC

  2. Потребителски въведени данни, почистете и дезинфекцирайте преди изпращане в db

  3. SQL заявка:подреждане по дължина на знаците?

  4. MySQL:Разбиране на таблици за картографиране

  5. int(11) срещу int(всичко друго)