【发布时间】:2018-04-12 15:35:12
【问题描述】:
DELIMITER $$
USE `temp` $$
DROP PROCEDURE IF EXISTS `GenerateUniqueValue`$$
CREATE PROCEDURE `GenerateUniqueValue`(IN tableName VARCHAR(255),IN columnName VARCHAR(255))
BEGIN
DECLARE uniqueValue VARCHAR(8) DEFAULT "";
DECLARE newUniqueValue VARCHAR(8) DEFAULT "";
WHILE LENGTH(uniqueValue) = 0 DO
SELECT CONCAT(SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1),
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1)
) INTO @newUniqueValue;
SET @rcount = -1;
SET @query=CONCAT('SELECT COUNT(*) INTO @rcount FROM ',tableName,' WHERE ',columnName,' like ''',newUniqueValue,'''');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
IF @rcount = 0 THEN
SET uniqueValue = @newUniqueValue ;
END IF ;
END WHILE ;
SELECT uniqueValue;
END$$
DELIMITER ;
我编写了这个程序来获取表中的唯一值。在随机时间,它返回一个重复值。选择查询不返回现有条件的结果。不知道我错过了哪里
【问题讨论】:
-
您似乎没有在此表中插入任何内容。您确定以前的值确实存在吗?另外,
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1)是错误的。该字符串长度为 35 个字符,因此应为RAND()*35。此外,MySQL 会将小数部分为 0.5 或更大的值四舍五入,因此如果您想以相等的概率选择每个字符,请尝试SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*35+0.5, 1)。 (或者使用FLOOR(),这会让你的代码看起来更合理一些。) -
我在每次插入之前调用此过程。流程是,获取唯一值,将其插入表中。我已经使用以下代码进行了测试, String query="CALL GenerateUniqueValue('test','UniqueValue')"; for(int i=0;i
标签: mysql stored-procedures random unique