我有一个证书数据库(MySql),每个证书都由一个代码标识,格式如下:
year
- number
其中Year是获得证书的年份的最后两位数字,Number是五位数的增量数字(例如14-12345
)。每年,Number部分必须重置。所以2015年的第一份证书将是15-00001。
我的问题在于" Number"部分代码。到现在为止我这样做了:
SELECT MAX(Number) FROM certificates WHERE Year = YEAR(NOW())
然后,在我的应用程序的一个单独的语句中,这样的事情(简化的伪代码):
INSERT INTO certificates (Year, Number) VALUES (YEAR(NOW()), ++Number)
在循环内部,插入多个新证书。
这可行,但在并发插入方面不太安全。也许我可以使用交易,但我认为这是一种更好的方式。
我想到了另一个表中的自动增量值和主表中的外键,但我不知道如何在每年更改时重置。
答案 0 :(得分:0)
第一次执行查询时每年新年:
SELECT MAX(Number) FROM certificates WHERE Year = YEAR(NOW())
结果将是NULL
添加一张支票,然后在NULL
的位置放一个代替。
答案 1 :(得分:0)
您可以在证书表中使用自动增量字段(ID)(可能已经有一个用于密钥),以及一个表格,用于收集有关每年插入的最后一个ID的信息(LastIDYear)。
您的年号字段是计算字段,其中数字部分为:
ID - (去年插入ID)。最后一年插入的ID可在上面的附加表中找到(LastIDYear)。您可以加入年份列中的表格以查找所需的所有信息。
序列中可能缺少数字..但我认为在年号证书描述中没有必要的完整序列。