【问题标题】:How to generate a unique random number when insert in MySQL?在 MySQL 中插入时如何生成唯一的随机数?
【发布时间】:2018-03-01 11:12:27
【问题描述】:

我有一个文章数据库,可能希望为每篇文章生成一个唯一的随机整数,以便可以通过https://blablabla.com/articles/8373734 等 URL 访问它们。

我可以在 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. 是否有任何有效的方法来生成这样的随机数而不检查每个循环的重复?

【问题讨论】:

  • 只需使用自动递增的 id。
  • 为什么必须是随机的?自增整数列保证唯一性。
  • 可能是UUID_SHORT()可以用
  • 因为我不希望整数是连续的
  • 真的需要您的 ID 为数字吗?它们可以是字符串吗?

标签: python mysql random


【解决方案1】:

逻辑与它们的主键结合 | 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

【讨论】:

    【解决方案2】:

    虽然我的 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
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 是的,这看起来不错,但它真的是独一无二的吗?数据库经常切换到不同的服务器进行备份和数据获取。
      • 如果你使用UUID(),你会得到一个128位的值,这实际上是唯一的。发生碰撞的可能性微乎其微。 UUID_SHORT() 的约束在链接文档中有所描述。
      • uuid_short 是自动增加的吗?我发现它们在我的服务器上从 25265837279543337 开始逐步增加
      • 我想知道,mysql 中的 ENCRYPT() 函数会是唯一的吗?例如,ENCRYPT(NOW())
      【解决方案4】:
      Use mysql function RAND()
      -------------------------
      
      select FLOOR(RAND() * 999999)
      

      【讨论】:

      • 我想知道,mysql 中的 ENCRYPT() 函数会是唯一的吗?例如,ENCRYPT(NOW())
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多