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

1 人关注

我有一个文章数据库,可能想为每篇文章生成一个唯一的随机整数,这样就可以通过URL访问它们,例如 https://blablabla.com/articles/8373734 etc.

我可以在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没有找到。看来,数字记录得很稀疏,不太可能通过自动增加来实现。

  • 有没有什么有效的方法来生成这样的随机数,而不需要检查每个循环的重复性?

  • 5 个评论
    只需使用一个自动递增的ID。
    为什么它必须是随机的?一个自动递增的整数列保证了唯一性。
    可以使用UUID_SHORT()。
    null
    因为我不希望整数是连续的
    Felk
    Do you 真的 你的ID需要是数字吗?它们可以是字符串吗?
    python
    mysql
    random
    null
    null
    发布于 2017-09-20
    4 个回答
    Raja Ramachandran
    Raja Ramachandran
    发布于 2021-10-21
    0 人赞同
    Use mysql function RAND()
    -------------------------
    select FLOOR(RAND() * 999999)
        
    null
    我在想,mysql中的ENCRYPT()函数会不会是唯一的?例如,ENCRYPT(NOW())
    Felk
    Felk
    发布于 2021-10-21
    0 人赞同

    你可以使用 UUID() ,或者如果它必须是数字的 UUID_SHORT() 对于这一点。

    null
    是的,这似乎不错,但它真的会是唯一的吗?数据库经常被切换到不同的服务器进行备份和数据获取。
    Felk
    如果你使用 UUID() ,你会得到一个128位的值,这实际上是唯一的。碰撞的几率低得可以忽略不计。 UUID_SHORT() 的约束条件在链接的文档中有所描述。
    null
    uuid_short是自动增加的吗?我发现它们在我的服务器上从25265837279543337逐级增加。
    null
    我在想,mysql中的ENCRYPT()函数会不会是唯一的?例如,ENCRYPT(NOW())
    Schuere
    Schuere
    发布于 2021-10-21
    0 人赞同

    尽管我的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)
        SET newUrlId = SELECT FLOOR(RAND() * 999999)
      END WHILE
      RETURN newUrlId
    

    话又说回来,当你可以用其他方法创造 "更大的随机数 "时,为什么还要制造这样的麻烦呢?

    function createBiggerNumber(id) {
      return (id * constants.MySecretMultiplyValue) + constants.MySecretAddedValue;
    function extractIdFromBiggerNumber(number) {
      return (number - constants.MySecretAddedValue) / constants.MySecretMultiplyValue
        
    Yogi Arif Widodo
    Yogi Arif Widodo
    发布于 2021-10-21
    0 人赞同

    该逻辑与主键|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));