根据特定信息为数据库生成ID

时间:2016-01-21 16:21:32

标签: c# sql sql-server database

我需要一种基于某些信息为数据库生成id的方法。根据用户注册的会议,ID会有所不同。 id将是与5个连续数字连接的事件标识符的4位数。例如:

活动A:1000

活动B:2000

活动C:3000

事件A的id可以是100012345,该id的下一个数字是100012346.事件B的id可以是200012345.等等。

  1. 那么如何获取特定事件的最后一个ID?
  2. 如何为此自动生成下一个号码?

4 个答案:

答案 0 :(得分:1)

对具有newid()默认值的ID使用uniqueidentifier类型,而不是int。这将自动创建guid类型的新id。

如果问题是要采用上次创建的ID。请在表UpdateDateCreateDate中创建两个新列。当您插入记录

CreateDate = DateTime.Now;

更新时

UpdateDate = DateTime.Now;

如果您想要获取最后一个创建项目,您将使用此查询从数据库中获取数据:

Select * from [TableName] Order By CreateDate Desc

答案 1 :(得分:1)

我建议您将eventid拆分为数据库中的两个单独的列,并将它们作为主键。

然后,如果您需要添加另一个密钥,请首先检查您需要的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。