【问题标题】:Auto increment column which resets every year每年重置的自动增量列
【发布时间】:2014-09-19 13:58:35
【问题描述】:

我有一个证书数据库 (MySql),每个证书都由一个代码标识,格式如下:

year-number

其中 Year 是获得证书的年份的最后两位数字,Number 是五位数字的增量数字(例如 14-12345)。每年,数字部分都必须重置。所以 2015 年的第一个证书将是 15-00001。 我的问题是代码的“数字”部分。现在我正在这样做:

SELECT MAX(Number) FROM certificates WHERE Year = YEAR(NOW())

然后,在我的应用程序的单独语句中,类似这样的内容(要简化的伪代码):

INSERT INTO certificates (Year, Number) VALUES (YEAR(NOW()), ++Number)

在循环内,插入多个新证书。

这可行,但在并发插入方面并不那么安全。也许我可以使用事务,但我认为有更好的方法。

我想到另一个表中的自动增量值和主表中的外键,但我不知道如何在每年更改时重置。

【问题讨论】:

  • 对表的主键使用自动递增的整数。使证书代码成为您通过触发器维护的另一列。

标签: mysql sql database-design


【解决方案1】:

您可以在证书表中使用自动增量字段 (ID)(可能您已经有一个作为密钥),以及在其中收集有关每年插入的最后一个 ID (LastIDYear) 的信息的表。

您的年份数字字段是一个计算字段,其中数字部分是:

ID -(去年插入的 ID)。最后一年插入的 ID 可在上面的附加表 (LastIDYear) 中找到。您可以加入年份列上的表格以查找所需的所有信息。

您可能在序列中缺少数字..但我认为在年份编号证书描述中具有完整序列并不是强制性的。

【讨论】:

  • MySql 不支持计算列(我认为),但你让我走对了。我可以对此发表看法。谢谢:)
【解决方案2】:

每年第一次执行查询时:

SELECT MAX(Number) FROM certificates WHERE Year = YEAR(NOW())

结果将是NULL
添加一个支票,然后在你得到 NULL 的地方放一个 1。

【讨论】:

    猜你喜欢
    • 2013-05-17
    • 2015-07-21
    • 2016-03-14
    • 2011-01-02
    • 2019-05-11
    • 2011-08-01
    • 2021-08-06
    • 1970-01-01
    • 2017-01-02
    相关资源
    最近更新 更多