[英]How to generate a unique random number when insert in MySQL?
我有一个文章数据库,可能希望为每篇文章生成一个唯一的随机整数,以便可以通过 URL 访问它们,例如https://blablabla.com/articles/8373734等。
我可以在 python 后端实现这一点,但我们如何在 MySQL 语句中实现这一点?
例如,完成了一篇新文章,并插入到数据库中:
INSERT into article_table (title, date, url_id) VALUES ('asdf', '11/11/1111', 8373734)
这里的 url_id 是自动生成的唯一随机整数(1000~10000000)。
我相信主键 ID 和自动增加是解决这个问题的好方法。 但我的问题是:
在实际场景中,他们(公司)是否真的使用主 ID 或自动增加? 这可能会暴露您(曾经)在数据库中拥有的数据。 以这个https://www.zhihu.com/question/41490222为例,我在41490222附近尝试了数百个号码,都返回404未找到。 似乎记录的数量非常稀少,不太可能通过自动增加来实现。
有没有有效的方法来生成这样的随机数而不检查每个循环的重复?
Use mysql function RAND()
-------------------------
select FLOOR(RAND() * 999999)
您可以使用UUID()
,或者如果它必须是数字UUID_SHORT()
。
尽管我的 sql 技能有点生疏,但我认为您可能想使用 RAND 函数创建一个函数。
CREATE PROCEDURE GetRandomValue()
BEGIN
DECLARE newUrlId INT DEFAULT 0;
WHILE (
newUrlId = 0
OR IF EXISTS(SELECT 1 FROM yourTable WHERE url_id = newUrlId)
)
DO
SET newUrlId = SELECT FLOOR(RAND() * 999999)
END WHILE
RETURN newUrlId
END
再说一次,为什么要大惊小怪,而您可以使用其他方法来创建“更大的随机数”
例如:
function createBiggerNumber(id) {
return (id * constants.MySecretMultiplyValue) + constants.MySecretAddedValue;
}
function extractIdFromBiggerNumber(number) {
return (number - constants.MySecretAddedValue) / constants.MySecretMultiplyValue
}
逻辑是结合他们的主键| id ,所以我们不需要重新检查数据是否存在。
DELIMITER $$
DROP TRIGGER IF EXISTS `auto_number`$$
CREATE TRIGGER `auto_number` BEFORE INSERT on users
FOR EACH ROW BEGIN
SET new.auto_number = CONCAT(new.id, LEFT(UUID(), 8));
END$$
DELIMITER ;
https://gist.github.com/yogithesymbian/698b27138a5ba89d2a32e3fc7ddd3cfb
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.