Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie generiere ich eine eindeutige, zufällige Zeichenfolge für eine meiner MySql-Tabellenspalten?

VOR DER UPDATE-Triggerlösung:

Sie können eine 6-stellige zufällige alphanumerische Zeichenfolge in Großbuchstaben erstellen mit:

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

Um keinen bereits bestehenden String zu erstellen, können Sie ein BEFORE UPDATE verwenden Abzug.

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 ;

Jedes Mal, wenn Sie Ihren CODE einstellen Spalte auf NULL in einem UPDATE -Anweisung erstellt der Trigger eine neue zufällige Zeichenfolge in einer Schleife, bis keine Übereinstimmung in der Tabelle gefunden wurde.

Jetzt können Sie alle NULL-Werte ersetzen durch:

update unique_codes set CODE = NULL where code is NULL;

In der SQLFiddle-Demo hier Ich verwende eine Zufallszeichenfolge mit einem Zeichen, um zu demonstrieren, dass kein Wert dupliziert wird.

Sie können denselben Code auch in einem BEFORE INSERT verwenden Abzug. Auf diese Weise können Sie einfach neue Zeilen mit CODE=NULL einfügen und der Trigger wird es auf eine neue eindeutige zufällige Zeichenfolge setzen. Und Sie müssen es nie wieder aktualisieren.

Originalantwort (32 Zeichenketten):

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

-- output example: 3AHX44TF

generiert eine 8-stellige alphanumerische Großbuchstaben-Zufallszeichenfolge. Verketten Sie vier davon, um 32 Zeichen zu erhalten:

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

Was ist also mit der Einzigartigkeit? Nun - versuchen Sie, Duplikate zu erzeugen;-)