Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak wygenerować unikalny, losowy ciąg dla jednej z moich kolumn tabeli MySql?

PRZED AKTUALIZACJĄ rozwiązanie wyzwalacza:

Możesz utworzyć 6-znakowy losowy ciąg alfanumeryczny składający się z wielkich liter za pomocą:

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

Aby nie tworzyć już istniejącego ciągu, możesz użyć BEFORE UPDATE cyngiel.

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 ;

Za każdym razem, gdy ustawiasz swój CODE kolumna na NULL w UPDATE instrukcji, wyzwalacz utworzy nowy losowy ciąg w pętli, dopóki w tabeli nie zostanie znalezione żadne dopasowanie.

Teraz możesz zamienić wszystkie wartości NULL na:

update unique_codes set CODE = NULL where code is NULL;

W demo SQLFiddle używam jednoznakowego losowego ciągu, aby zademonstrować, że żadna wartość nie jest zduplikowana.

Możesz również użyć tego samego kodu w BEFORE INSERT cyngiel. W ten sposób możesz po prostu wstawić nowe wiersze z CODE=NULL a wyzwalacz ustawi go na nowy unikalny losowy ciąg. I już nigdy nie będziesz musiał go aktualizować.

Oryginalna odpowiedź (32 ciągi znaków):

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

-- output example: 3AHX44TF

wygeneruje losowy ciąg składający się z 8 znaków alfanumerycznych pisanych wielkimi literami. Połącz cztery z nich, aby uzyskać 32 znaki:

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

A co z wyjątkowością? Cóż - spróbuj wygenerować duplikaty;-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Limit rozmiaru importu pliku w PHPMyAdmin

  2. Wyzwalacz MySQL ustawia wartości dla NOWEGO wiersza i aktualizuje inny w tej samej tabeli

  3. PDO:nie można znaleźć sterownika php/mysql

  4. MySql, PHP wyświetla obraz w HTml

  5. Zainstaluj MySQL 5.6 na Ubuntu 20.04