【问题标题】:A fresh SQL sequence per day每天一个新的 SQL 序列
【发布时间】:2010-10-07 22:39:30
【问题描述】:

在 SQL 数据库中每天创建新的序列号序列的好方法是什么?

类似于某些数据库系统中整数列的自动递增功能。

我正在创建/记录交易,交易由“日期,序列号”对标识。

【问题讨论】:

  • 正常(单调递增)序列号有什么问题?
  • 这是一个包含日期+序列号的证书。鉴于日期每隔几个小时更改一次,我不需要这么大的序列号插槽。我正在努力保护每个角色。
  • 大部分数据库系统都有序列机制,你可以重置为0。你的数据库系统是什么?
  • 我正在使用 mysql。扭曲的是,我想颁发的证书不仅仅是“今天”。我想我需要一个“下一个连续”表(每年有 365 个条目),以及更新它们的原子方式。

标签: sql date


【解决方案1】:

最好的方法是使用日期作为数字的一部分,例如今天从 080216001 到 080216999。你可以有不连续的数字吗?

【讨论】:

  • 你在哪一年?对我来说是 2009 年 2 月 16 日 :D 我们这么快就忘记了千年虫吗?
【解决方案2】:

这取决于您拥有什么样的数据库。如果您可以访问全局变量或生成器,只需每天重置它并使用它来为您的序列号列播种。如果没有,您可以将该值存储在一个表中并查找它来为您的列播种,每天再次重置它。

如有必要,请不要忘记手动增加种子。 (生成器是一种特殊的全局变量,如果设置为自动递增,则可以自动递增。其他变量,当然还有表中的记录也不会。)

要重置该值,只需在插入时设置一个触发器,检查COUNT(DATE = today) 是否为 0。如果是,请重置该值。

【讨论】:

    【解决方案3】:

    专门为此目的的特定表怎么样?

    create table AvailableSerialNumbers (
      AvailableOn datetime primarykey,
      NextAvailableNumber int
    )
    

    您必须提前填充它,但这很简单(确保这是自动完成的,而不是手动完成的)。

    请注意,如果您同时创建大量序列号记录,则创建逻辑将成为更新 AvailbleSerialNumbers 记录的瓶颈。该问题的最简单解决方案是每天定义多个 AvailableSerialNumbers 记录(比如 100 个)并随机选择 1 个进行更新。如果使用这种方法而不是“NextAvailableNumber”字段,它应该是从/到范围。当范围达到 0 时删除范围记录。

    【讨论】:

      猜你喜欢
      • 2020-05-29
      • 2020-08-01
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多