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

时间:2017-09-20 11:48:39

标签: python mysql random

我有一个文章数据库,可能希望为每篇文章生成一个唯一的随机整数,以便可以通过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. 有没有有效的方法来生成这样的随机数而不检查每个循环的重复?

3 个答案:

答案 0 :(得分:0)

Use mysql function RAND()
-------------------------

select FLOOR(RAND() * 999999)

答案 1 :(得分:0)

您可以使用UUID(),或者必须使用数字UUID_SHORT()

答案 2 :(得分: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)
  )
  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
}