Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara menghasilkan string acak yang unik untuk salah satu kolom tabel MySql saya?

SEBELUM MEMPERBARUI solusi pemicu:

Anda dapat membuat string huruf besar alfanumerik acak 6 karakter dengan:

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

Agar tidak membuat string yang sudah ada, Anda dapat menggunakan BEFORE UPDATE pemicu.

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 ;

Setiap kali Anda menyetel CODE kolom ke NULL dalam UPDATE pernyataan, pemicu akan membuat string acak baru dalam satu lingkaran sampai tidak ada kecocokan yang ditemukan di tabel.

Sekarang Anda dapat mengganti semua nilai NULL dengan:

update unique_codes set CODE = NULL where code is NULL;

Dalam demo SQLFiddle di sini saya menggunakan string acak satu karakter untuk menunjukkan bahwa tidak ada nilai yang diduplikasi.

Anda juga dapat menggunakan kode yang sama di BEFORE INSERT pemicu. Dengan cara ini Anda bisa memasukkan baris baru dengan CODE=NULL dan pemicu akan menyetelnya ke string acak unik yang baru. Dan Anda tidak perlu memperbaruinya lagi.

Jawaban asli (32 karakter string):

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

-- output example: 3AHX44TF

akan menghasilkan string acak huruf besar alfanumerik 8 karakter. Gabungkan empat dari mereka untuk mendapatkan 32 karakter:

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

Lalu bagaimana dengan keunikan? Yah - coba buat duplikat;-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara mengulangi menurut baris melalui kueri mysql di php

  2. Penggunaan MySQL JIKA ADA

  3. Rails, MySQL dan Snow Leopard

  4. Apakah nama kolom dan tabel peka huruf besar/kecil di MySQL?

  5. perbarui data di div