2010-06-21 112 views

回答

1

如果你想保證唯一性,那麼你必須檢查一些東西。你可以使用一個平面文件並存儲最近使用的數字(然後你可以增加),但是如果不使用數據庫就很愚蠢。您需要存儲鏈接到該號碼的其他一些信息(聯繫詳情,訂單包含的內容等),並且數據庫非常適合您。

+0

如果我從日期字符串這樣的日期(YmbHis),這將是唯一的產生,如果該網站被大量使用 – Smith 2010-06-21 05:52:26

+0

^特別是如果你的服務器DST觀察。我認爲最好只檢查數據庫(或者按照托馬斯的建議讓它爲您生成訂單號)。這對數據庫並不重要,即使是這樣,你可能每分鐘生成的訂單數也不會超過幾十個。 – 2010-06-21 06:39:48

0

如果您使用的是MySQL數據庫,則可以生成序列號,而無需使用auto_increment列預先檢查數據庫。插入新行將導致將新的唯一ID分配給該列,而無需在PHP中讀取/寫入該列。

另外,如果你想要一個沒有數據庫的全局唯一ID,那麼你可以使用PHP的uniqid()函數。請注意,這會返回一個字符串。如果您使用多臺物理機器或在服務器之間移動,則應在每臺機器上添加一個不同的前綴(第一個參數)。當在同一臺機器上使用時,該函數不應該返回兩次相同的字符串值。

+0

可以mysql_return最後一個唯一的ID而不重新查詢數據庫? – Smith 2010-06-21 05:57:55

+0

@Smith:http://php.net/manual/en/function.mysql-insert-id.php(但不知道它是否重新查詢。) – Svish 2010-06-21 08:58:11

+0

我懷疑mysql_insert_id是否創建了一個新的數據庫查詢,給定了描述(例如,它保留的時間少於MySQL的LAST_INSERT_ID())。但這是一個很好的問題。 – thomasrutter 2010-06-22 06:12:56

1

有在MySQL使用自動增量列的幾個問題(至少不是事實,即它不能擴展到相當於節點)。

儘管您可以在任何地方維護序列生成器(memcache,files,database),但PHP不會影響複雜的文件鎖定語義 - 除了影響性能外,您還可以快速進入處理鎖定狀態。它不能擴展到大容量。

如果你有PL/SQL可用,那麼我建議在那裏實現一個序列生成器 - 或者你可以考慮在PHP和sqlite中實現一個生成器。

我強烈建議你實現你的生成器來創建格式的數字:

$ use_number = ++ $ sequence_number。 str_pad($ node_id,'0',$ max_nodes,STR_PAD_LEFT);

其中node_id是唯一引用存儲當前序列號的存儲基底的數字。並且$ max_nodes比$ node_id中的最大位數還要多(例如,3將允許多達999個節點)。

或者把它當作一個帶有2個部分之間的標點符號的字符串(和/或將2個部分存儲在不同的數據庫列中)。

C.