Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 每年重置的自动增量列_Mysql_Sql_Database Design - Fatal编程技术网

Mysql 每年重置的自动增量列

Mysql 每年重置的自动增量列,mysql,sql,database-design,Mysql,Sql,Database Design,我有一个证书数据库(MySql),每个证书由一个代码标识,格式如下: 年份-编号 其中,年份是获得证书年份的最后两位数,数字是五位数的递增数字(例如14-12345)。每年,数字部件必须重置。因此,2015年的第一份证书将是15-00001。 我的问题是代码的“数字”部分。现在我正在做这件事: SELECT MAX(Number) FROM certificates WHERE Year = YEAR(NOW()) 然后,在我的应用程序中的一个单独语句中,类似这样的内容(简化为伪代码): 在循

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

年份
-
编号

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

SELECT MAX(Number) FROM certificates WHERE Year = YEAR(NOW())
然后,在我的应用程序中的一个单独语句中,类似这样的内容(简化为伪代码):

在循环中,插入多个新证书

这是可行的,但就并发插入而言并不安全。也许我可以用一笔交易,但我认为有更好的办法


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

每年第一次执行查询时:

SELECT MAX(Number) FROM certificates WHERE Year = YEAR(NOW())
结果将是一个
NULL


添加一个检查,当您得到一个
NULL
时,您可以将其改为1。

您可以在表证书中使用一个自动递增字段(ID)(可能您已经有一个用于密钥)和一个表,在该表中您可以收集关于每年插入的最后一个ID的信息(LastyDear)

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

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


序列中可能缺少编号。。但是我认为在年号证书描述中不必有完整的序列。

使用自动递增整数作为表的主键。让证书代码成为您通过触发器维护的另一列。MySql不支持计算列(我认为),但您让我走上了正确的道路。我可以看看这个。谢谢:)
SELECT MAX(Number) FROM certificates WHERE Year = YEAR(NOW())