2011-06-09 159 views
1

我想为发票生成客户ID,因此不希望从1开始计数,原因很明显。在MySQL中,你可以生成一个独特的随机数字吗?生成唯一的10位数

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

不起作用:

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

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

+0

这里有什么明显的原因?如果您猜对了下一个ID,或者以某种方式欺骗,发票是否会以某种方式显示?如果是这种情况,您有一个不同的问题,并且需要确保查看发票的任何人都有权这样做。取而代之的是,我会使用UUID函数(请参阅http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid),尽管这看起来像是重大的矫枉过正。 – muffinista 2011-06-09 00:55:24

+0

不,实际上我没有考虑任何与欺骗行为有关的事情。更多的是,公司是一家初创公司,他们不希望透露你是他们的第一个客户:-) – 2011-06-09 01:03:47

回答

4

我建议一个AUTO_INCREMENT柱中,在10位种子值。您可以将其设置为表中的唯一一列,如下所示,或者更实际地为您的发票表ID添加种子。

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

我喜欢这个想法,但客户仍然会看到一个1000000001并且知道这是第一张发票;-)也许我应该选择一个随机数并从那里出发。 – 2011-06-09 01:02:48

+0

够公平的。您必须预先填充此表并将行标记为* used *。但显然这个解决方案存在限制。 – 2011-06-09 01:06:08

+0

我现在更改为auto_increment值疯狂,希望没有人会注意到他们是第一个客户:-)感谢您的帮助! +1 – 2011-06-09 01:08:49

2

其实,原因不是很明显,除非它只是你不想让你的客户知道有这么几个,他们都:-)

作为一个数字标识此外,客户ID通常在添加客户而不是发票时生成。如果你的意思是发票号码,那就不同了,但推理是一样的。

无论填充该表与用合适的低级ID(314159例如)虚拟条目然后使用类似:

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

,或者使用自动递增密钥与合适的起始值(再次,此值取决于你,但你应该选择一些相对“非圆”的东西)。

我有时用前者为这里我想跟值分配什么完全的控制(包括很容易改变它们的能力),但更强大的解决方案可能会自动递增一个情况。

0
ALTER TABLE my_invoice_table auto_increment=1000000001 

递增发票编号都很好 - 他们只是必须是唯一的,不是随机的。