2011-06-09 35 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 

遞增發票編號都很好 - 他們只是必須是唯一的,不是隨機的。