我为我们的预订系统编写了一个发票模块。
所以当我创建一个新的发票时,我会通过 MySQL 自动生成一个主键。
然而,目前这只是一个简单的整数计数。
问题是我们有义务以“#year#id”的形式提供发票编号,其中#year 是例如 2013,而#id 是每年从 1 开始的 id。
因此,例如 20131、20132、20133 和 2014 年将是 20141、20142。
如何使用自定义主键生成器解决此问题?
我为我们的预订系统编写了一个发票模块。
所以当我创建一个新的发票时,我会通过 MySQL 自动生成一个主键。
然而,目前这只是一个简单的整数计数。
问题是我们有义务以“#year#id”的形式提供发票编号,其中#year 是例如 2013,而#id 是每年从 1 开始的 id。
因此,例如 20131、20132、20133 和 2014 年将是 20141、20142。
如何使用自定义主键生成器解决此问题?
您可以在您的年份和 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(NOW())
您不必指定 id。
您应该使用过程或触发器。构建 newInvoiceId 的特定查询应该是这样的:
SELECT CONCAT(YEAR(now()),count(*)+1) as newInvoiceId
FROM table
WHERE InvoiceId like CONCAT(YEAR(now()),'%');
我不是 100% 有信心的唯一部分是CONCAT(YEAR(now()),'%')
警告不要像 2012/01 这样幼稚的年/周。YEAR(NOW()) 是错误的。
更好用YEARWEEK(NOW())
。给出一个像 201201 这样的数字
下面显示 year 不一定是 year-of-week-number:
mysql> SELECT YEARWEEK('1987-01-01');
-> 198652
对于在一个 int 中包含年和周的其余部分,实际上更简单。
int year = yearweek / 100;
int week = yearweek % 100;