我想爲發票生成客戶ID,因此不希望從1開始計數,原因很明顯。在MySQL中,你可以生成一個獨特的隨機數字嗎?生成唯一的10位數
我知道RAND()函數,但它並不保證唯一性。什麼是正確的方法呢?
不起作用:
INSERT INTO test (number) VALUES (FLOOR(0 + (RAND() * 9999999999)));
PS:服務器端我使用PHP和使用FPDF生成發票。
我想爲發票生成客戶ID,因此不希望從1開始計數,原因很明顯。在MySQL中,你可以生成一個獨特的隨機數字嗎?生成唯一的10位數
我知道RAND()函數,但它並不保證唯一性。什麼是正確的方法呢?
不起作用:
INSERT INTO test (number) VALUES (FLOOR(0 + (RAND() * 9999999999)));
PS:服務器端我使用PHP和使用FPDF生成發票。
我建議一個AUTO_INCREMENT
柱中,在10位種子值。您可以將其設置爲表中的唯一一列,如下所示,或者更實際地爲您的發票表ID添加種子。
CREATE TABLE tablename (
id bigint unsigned not null auto_increment,
primary key(id),
auto_increment=1000000000
);
我喜歡這個想法,但客戶仍然會看到一個1000000001並且知道這是第一張發票;-)也許我應該選擇一個隨機數並從那裏出發。 – 2011-06-09 01:02:48
夠公平的。您必須預先填充此表並將行標記爲* used *。但顯然這個解決方案存在限制。 – 2011-06-09 01:06:08
我現在更改爲auto_increment值瘋狂,希望沒有人會注意到他們是第一個客戶:-)感謝您的幫助! +1 – 2011-06-09 01:08:49
其實,原因不是很明顯,除非它只是你不想讓你的客戶知道有這麼幾個,他們都:-)
作爲一個數字標識此外,客戶ID通常在添加客戶而不是發票時生成。如果你的意思是發票號碼,那就不同了,但推理是一樣的。
無論填充該表與用合適的低級ID(314159例如)虛擬條目然後使用類似:
insert into test (number) select max(number)+1 from test
,或者使用自動遞增密鑰與合適的起始值(再次,此值取決於你,但你應該選擇一些相對「非圓」的東西)。
我有時用前者爲這裏我想跟值分配什麼完全的控制(包括很容易改變它們的能力),但更強大的解決方案可能會自動遞增一個情況。
ALTER TABLE my_invoice_table auto_increment=1000000001
遞增發票編號都很好 - 他們只是必須是唯一的,不是隨機的。
這裏有什麼明顯的原因?如果您猜對了下一個ID,或者以某種方式欺騙,發票是否會以某種方式顯示?如果是這種情況,您有一個不同的問題,並且需要確保查看發票的任何人都有權這樣做。取而代之的是,我會使用UUID函數(請參閱http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid),儘管這看起來像是重大的矯枉過正。 – muffinista 2011-06-09 00:55:24
不,實際上我沒有考慮任何與欺騙行爲有關的事情。更多的是,公司是一家初創公司,他們不希望透露你是他們的第一個客戶:-) – 2011-06-09 01:03:47