场景:WAMP 服务器、InnoDB 表、自动递增唯一 ID 字段 [INT(10)
]、100 多个并发 SQL 请求。如果需要,也应使用 VB.Net。
我的数据库有一个自动递增字段,用于为每个存储的新信息(服务订单)生成一个唯一票/协议(protocol)号。
问题是这个数字每年必须重置。 IE。它从 01/01/2012 00:00:00 的 000001/12
开始到最大值 999999/12
然后在 01/01/2013 00:00:00它必须重新开始到 000001/13
。
显然,使用某种算法应该很容易完成,但是,我正试图找到一种更有效的方法来做到这一点。考虑:
它必须(?)使用自动递增,因为数据库有一定的并发性(+100)。
每张票必须唯一。所以 2012 年的
000001
不等于 2013 年的000001
。它必须是自动的。 (无需人工交互即可进行重置或其他操作)
它应该相当高效。 (监视程序应该每天检查数据库(?),但这似乎不是最好的解决方案,因为它将“失败”364 次,而只有一次成功。
我能想到的“最佳”方法是使用年份存储票号,例如:
12000001
- 12999999
(无论如何都不应该达到 999.999)
然后 watch 程序应在 2013 年 1 月 1 日将自动递增字段设置为 13000000
。
有什么建议吗?
PS:感谢阅读...;)
最佳答案
因此,为了进一步引用,我采用了以下解决方案:
我确实在数据库上创建了 n 个表(每年一个),只有一个自动递增字段负责生成每年的唯一 ID。
因此,考虑到事件 日期,新的插入操作会被插入到相应的表中。之后,该算法使用 last_inseted_id() 将该值存储到主表中,格式为 000001/12。 (票/年)
那是因为每年都必须有自己的计数器,因为即使当前日期已经是 2013 年,也会插入 2012 年的事件。
这样事件应该是可追溯的,不需要重置,而且实现起来很简单。
插入示例代码:
$eventdate="2012-11-30";
$eventyear="2012";
$sql = "INSERT INTO tbl$eventyear VALUES (NULL)";
mysql_query ($sql);
$sql = "LAST_INSERT_ID()";
$row = mysql_fetch_assoc(mysql_query($sql));
$eventID = $row(0)
$sql = "INSERT INTO tblMain VALUES ('$eventID/$eventYear', ... ";
mysql_query($sql)
关于mysql - 如何实现高效的数据库驱动的工单/协议(protocol)控制系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11103374/