【问题标题】:Generate unique 10-digit number生成唯一的 10 位数字
【发布时间】:2011-06-09 00:52:02
【问题描述】:

我想为发票生成客户 ID,因此出于显而易见的原因不想从 1 开始计数。在 MySQL 中你能生成一个唯一的随机数吗?

我知道 RAND() 函数,但它不能保证唯一性。什么是正确的方法?

不起作用:

INSERT INTO test (number) VALUES (FLOOR(0 + (RAND() * 9999999999)));

PS:服务器端我使用 PHP 并使用 FPDF 生成发票。

【问题讨论】:

  • 这里明显的原因是什么?如果您猜到下一个 id,发票是否会以某种方式可见,或者以某种方式被欺骗?如果是这种情况,您有不同的问题,需要确保查看发票的任何人都有权这样做。取而代之的是,我会使用 UUID 函数(请参阅dev.mysql.com/doc/refman/5.0/en/…),尽管这看起来有点矫枉过正。
  • 不,实际上我没有考虑与欺骗等有关的任何事情。更多的是该公司是一家初创公司,他们不希望透露您是他们的第一个客户 :-)

标签: mysql numbers unique


【解决方案1】:

我建议使用AUTO_INCREMENT 列并将值设置为 10 位数。您可以让它成为表中唯一的列,如下所示,或者更实际地为您的发票表 ID 提供种子。

CREATE TABLE tablename (
  id bigint unsigned not null auto_increment,
  primary key(id),
  auto_increment=1000000000
);

【讨论】:

  • 我喜欢这个主意,但客户仍然会看到 1000000001 并且知道这是第一张发票 ;-) 也许我应该选择一个随机数并从那里开始。
  • 很公平。您必须预先填充此表并将行标记为 used。但显然这种解决方案存在局限性。
  • 我现在将 auto_increment 值更改为疯狂,希望没有人会注意到他们是第一个客户 :-) 感谢您的帮助! +1
  • Jason,我认为 Frank 的意思是随机 starting 值,使用您的解决方案,而不是每次都使用随机值。
  • 我明白了。那么弗兰克所做的应该没问题 - 以随机的 10 位数字开始种子并从那里自动递增。在这种情况下,我认为这是合适的解决方案,因为它比预填充的键表更强大。
【解决方案2】:

实际上,原因并不那么明显,除非您只是不想让您的客户知道他们的 ID 太少以至于他们都有一位数字 :-)

顺便说一句,客户 ID 通常是在添加客户时生成的,而不是生成发票。如果您指的是发票号码,那是不同的,但推理是一样的。

要么使用具有适当较低 ID(例如 314159)的虚拟条目填充表,然后使用类似:

insert into test (number) select max(number)+1 from test

或使用具有合适起始值的自动递增键(同样,该值取决于您,但您应该选择相对“非圆形”的值)。

我有时会在我希望完全控制分配的值(包括轻松更改它们的能力)的情况下使用前者,但更强大的解决方案可能是自动增量解决方案。

【讨论】:

    【解决方案3】:
    ALTER TABLE my_invoice_table auto_increment=1000000001
    

    递增发票编号很好 - 它们只需要唯一,而不是随机的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多