2010-06-21 53 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.