每个用户集可能都有一个AccountNumber,因此为了创建一个新帐户,我会将现有最高帐号增加1.您如何跟踪上次发布的号码?当然,人们可以遍历所有帐户进行检查,但是有没有理由为什么人们可能选择保留最后发布的号码或所有号码的单独表格?
我只是看几千个账户,所以我并不担心优化问题。
答案 0 :(得分:4)
如果您正在使用MS SQL,则应该使用IDENTITY
,如果您正在使用其他数据库,则应该使用等效的。
即使两个人同时尝试创建帐户,也会正确跟踪ID。
答案 1 :(得分:1)
如果您使用的是Oracle,请使用序列。 http://www.techonthenet.com/oracle/sequences.php
对于MSSQL使用这样的东西。 http://blogs.msdn.com/b/sqlcat/archive/2006/04/10/sql-server-sequence-number.aspx
答案 2 :(得分:0)
这个问题最初被标记为.Net和C#所以我假设MSSQL,它不是。我不知道在与Sqlite一起使用时,这个答案有多少是有效的。
有几种策略可以解决这个问题。我认为这两个最有趣:
使用IDENTITY
列,当两个进程同时创建帐户,回滚事务和其他内容时,它会自动处理竞争条件。 IDENTITY
列的缺点是您的数字系列可能会出现漏洞。如果这是不可接受的,则需要使用另一种方法。
自己处理数字。我更喜欢一个特殊的表,包含下一个免费号码。创建新帐户时,必须在事务中执行此操作,使用隔离级别在读取时立即锁定自由编号表并保持锁定直到存储更新的编号。这样做很难做,而且可扩展性会降低,但是你可以保证你得到连续的数字。
无论哪种方式,您都应该在帐号列上有一个唯一的密钥作为额外的安全措施。
答案 3 :(得分:0)
我担心我不熟悉SQLlite。但是现在大多数SQL引擎都有某种“自动编号”功能。
如果失败,请创建一个序列。数据库引擎应该为您管理序列,这样您就不会得到重复的数字。
如果出于某种原因,这些事情都不可能,那么您可以创建一个单独的表来保存最后使用的ID。请务必使用“select for update”来阅读它以避免竞争条件。
答案 4 :(得分:-2)
如果您使用的是SQL Server,可以使用Max函数,该函数将返回您查看的行的最高值。
更新:
简单的例子。
Select Max(AccountNumber) from Accounts
更新:
好的,也许我错了不要使用Max,因为这会导致一些问题。 :(对不起。