【问题标题】:Generate ids for a database based on certain information根据某些信息为数据库生成 id
【发布时间】:2016-01-21 16:21:32
【问题描述】:

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

事件 A:1000

事件 B:2000

事件 C:3000

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

  1. 那么如何获取某个事件的最后一个 id?
  2. 如何为此自动生成下一个数字?

【问题讨论】:

  • 你要从这里聘请开发人员
  • @un-lucky 嗯?我正在对其进行编码,但我不确定如何从具有特定条件的数据库中提取最后一个 id。
  • 为什么没有自动生成的 id,然后将此值作为某种形式的参考。然后处理此“递增/自动生成”注册码的最简单方法是为您的事件查找表,然后为它查找下一个可用的 id。例如event a1000 next code12345

标签: c# sql sql-server database


【解决方案1】:

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

如果问题是获取最后创建的 ID。在表 UpdateDateCreateDate 中创建两个新列。插入记录时

CreateDate = DateTime.Now;

更新中

UpdateDate = DateTime.Now;

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

Select * from [TableName] Order By CreateDate Desc

【讨论】:

    【解决方案2】:

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

    然后,如果您需要添加另一个密钥,首先检查您需要什么 event(例如 1000),然后检查 DB 上该事件的最大 id 是多少。这应该回答您的第一个问题。

    至于你的第二个问题,一旦你获得了活动的最大id,你就可以添加+1。

    或者更好的是,您可以将 id 定义为自动增量,但我不确定它是否适用于复杂主键的单个部分。

    希望这会有所帮助! :)

    【讨论】:

      【解决方案3】:

      如果您坚持将两个 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 中唯一的自动递增字段。

      【讨论】:

        【解决方案4】:

        在我看来,触发器是一个不错的选择。您可以创建一个在插入之前触发的 sql 触发器,检查用户正在注册的事件,并生成相应的 Id。

        【讨论】:

        • 当动作可以简单地写入业务逻辑时,通常没有理由使用触发器,即:存储过程(最好)或客户端代码。
        猜你喜欢
        • 2020-03-11
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多