繁体   English   中英

在MySQL中插入时如何生成唯一的随机数?

[英]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 和自动增加是解决这个问题的好方法。 但我的问题是:

  1. 在实际场景中,他们(公司)是否真的使用主 ID 或自动增加? 这可能会暴露您(曾经)在数据库中拥有的数据。 以这个https://www.zhihu.com/question/41490222为例,我在41490222附近尝试了数百个号码,都返回404未找到。 似乎记录的数量非常稀少,不太可能通过自动增加来实现。

  2. 有没有有效的方法来生成这样的随机数而不检查每个循环的重复?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM