【问题标题】:MySQL custom primary key generatorMySQL 自定义主键生成器
【发布时间】:2013-02-15 15:47:50
【问题描述】:
我已经为我们的预订系统编写了一个发票模块。
所以当我创建一个新发票时,我会通过 MySQL 自动生成一个主键。
但目前这只是一个简单的整数计数。
问题是我们有义务以“#year#id”的形式提供发票编号,其中#year 是例如。 2013 年,#id 是每年从 1 开始的 id。
例如20131、20132、20133,2014 年将是 20141、20142。
如何使用自定义主键生成器解决此问题?
【问题讨论】:
标签:
java
mysql
primary-key
generator
【解决方案1】:
您可以在您的年份和id中创建两个字段。
在两个字段上创建一个主键,为 id 提供 auto_increment 选项。
对于 year 的每个唯一值,id 将向上计数。例如:
2012 1
2012 2
2012 3
2013 1
您可以在选择时连接它们:SELECT CONCAT(year,id) AS primary FROM table
插入将是:
INSERT INTO 表 SET year = YEAR(NOW())
您不必指定 id。
【解决方案2】:
您应该使用过程或触发器。
构建 newInvoiceId 的特定查询应该是这样的:
SELECT CONCAT(YEAR(now()),count(*)+1) as newInvoiceId
FROM table
WHERE InvoiceId like CONCAT(YEAR(now()),'%');
我不能 100% 确定的唯一部分是 CONCAT(YEAR(now()),'%')
【解决方案3】:
警告不要像 2012/01 这样幼稚的年/周。 YEAR(NOW()) 错误。
最好使用YEARWEEK(NOW())。给出一个类似 201201 的数字
以下显示年份不一定是 year-of-week-number:
mysql> SELECT YEARWEEK('1987-01-01');
-> 198652
对于其余的在一个 int 中包含年和周,实际上更简单。
int year = yearweek / 100;
int week = yearweek % 100;