我需要一种基于某些信息为数据库生成id的方法。根据用户注册的会议,ID会有所不同。 id将是与5个连续数字连接的事件标识符的4位数。例如:
活动A:1000
活动B:2000
活动C:3000
事件A的id可以是100012345,该id的下一个数字是100012346.事件B的id可以是200012345.等等。
答案 0 :(得分:1)
对具有newid()默认值的ID使用uniqueidentifier
类型,而不是int。这将自动创建guid类型的新id。
如果问题是要采用上次创建的ID。请在表UpdateDate
和CreateDate
中创建两个新列。当您插入记录
CreateDate = DateTime.Now;
更新时
UpdateDate = DateTime.Now;
如果您想要获取最后一个创建项目,您将使用此查询从数据库中获取数据:
Select * from [TableName] Order By CreateDate Desc
答案 1 :(得分:1)
我建议您将event
和id
拆分为数据库中的两个单独的列,并将它们作为主键。
然后,如果您需要添加另一个密钥,请首先检查您需要的event
(例如1000),然后检查DB对该事件的最大id
是什么。这应该回答你的第一个问题。
至于你的第二个问题,一旦你获得了事件的最大id
,你就可以加+1。
或者甚至更好,您可以将id
定义为自动增量,但我不确定它是否适用于复杂主键的单个部分。
希望这有帮助! :)
答案 2 :(得分:1)
如果您坚持将两个int值组合为一个字符串,那么您必须进行搜索。由于您使用的是字符串,因此您需要确保序列号为零填充,例如,200000001是事件B的第一个ID。鉴于此,查询
Select top 1 ID from [TableName] Where ID like '2000%' Order By ID Desc
应该为您提供最大的ID,您必须将其拆分/转换为int并增加它。当然,当您尝试创建记录时,您将需要一些冲突处理代码,除非您在更改数据库时是单线程/进程。
您可能需要考虑将这两个概念区分开来。您可以使用单个int字段来阻止进行字符串搜索,而是在需要将它们作为组合标识符显示时组合这两个int值。那么你的SQL是
Select Top 1 SequenceId from [TableName] Where EventId=2000 Order By SequenceId Desc
此外,如果您确实需要自动递增的序列标识符,则必须在每个表上移动到每个事件的表,并且每个表上都有一个自动递增的PK,因为主键是SQL Server中唯一的自动递增字段。
答案 3 :(得分:-1)
在我看来,触发器将是一个不错的选择。您可以创建一个sql触发器,它将在插入之前触发,检查用户正在注册的事件,并生成相应的Id。