Dav*_*ave 17 mysql random constraints unique sql-update
我正在使用MySql 5.5.37.我有一个包含以下列的表
+------------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+-------+
| ID | varchar(32) | NO | PRI | NULL | |
| CODE | varchar(6) | NO | UNI | NULL | |
Run Code Online (Sandbox Code Playgroud)
代码列是唯一的,我的ID列是GUID.根据上表中的某些条件(例如WHERE COLUMN1 = 0),我想要更新多行.如何为我的CODE列生成随机的,唯一的6个字符的代码(理想情况是字母和数字),以便它们不违反我表中的唯一约束?请注意,表中不符合条件的列(例如,其中COLUMN1 <> 0)已经具有CODE列的唯一值.
编辑:这与这个问题不同 - 使用MySQL生成随机和唯一的8个字符串,因为该链接处理ID taht是数字.我的ID是32个字符的字符串.此外,他们的解决方案没有考虑在运行我想要运行的语句之前表中可能有值的事实,这将为相关列生成唯一值.
Pau*_*gel 20
BEFORE UPDATE触发器解决方案:
您可以使用以下命令创建一个6个字符的随机字母数字大写字符串:
lpad(conv(floor(rand()*pow(36,6)), 10, 36), 6, 0);
Run Code Online (Sandbox Code Playgroud)
为了不创建现有的字符串,您可以使用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 ;
Run Code Online (Sandbox Code Playgroud)
您在设置每次CODE列NULL在一个UPDATE声明中,直到没有匹配已经在表中发现的触发将建立在一个循环中一个新的随机字符串.
现在,您可以将所有NULL值替换为:
update unique_codes set CODE = NULL where code is NULL;
Run Code Online (Sandbox Code Playgroud)
在这里的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
Run Code Online (Sandbox Code Playgroud)
将生成一个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
Run Code Online (Sandbox Code Playgroud)
http://sqlfiddle.com/#!9/9eecb7d/76933
那么uniqness呢?好吧 - 尝试生成重复项;-)