我已为我们的预订系统编写了发票模块。
因此,当我创建新发票时,我会通过MySQL自动生成主键。
但目前这只是一个简单的整数计数。
问题是我们有义务以“#year#id”的形式提供发票号,其中#year是例如2013年和#id是每年从1开始的ID。
所以,例如20131年,20132年,20133年和2014年将是20141年,2014年。
如何使用自定义主键生成器解决此问题?
答案 0 :(得分:2)
你可以在你的年份和身份证中创建两个字段。
在两个字段上创建一个主键,为id赋予auto_increment选项。 对于每年的唯一值,id将计数。例如:
2012 1
2012 2
2012 3
2013 1
您可以在选择时连接它们:SELECT CONCAT(year,id)AS primary FROM table
插入将是:
INSERT INTO表SET year = YEAR(NOW())
您不必指定ID。
答案 1 :(得分:2)
您应该使用程序或触发器。 构建newInvoiceId的特定查询应该是这样的:
SELECT CONCAT(YEAR(now()),count(*)+1) as newInvoiceId
FROM table
WHERE InvoiceId like CONCAT(YEAR(now()),'%');
我不是100%自信的唯一部分是CONCAT(YEAR(now()),'%')
答案 2 :(得分:0)
对2012/01年度的幼稚年/周的警告。年(现在())错了。
更好地使用YEARWEEK(NOW())
。给出一个像201201
以下显示年份不一定是星期数:
mysql> SELECT YEARWEEK('1987-01-01');
-> 198652
对于在一个单独的int中具有年和周的其余部分,实际上更简单。
int year = yearweek / 100;
int week = yearweek % 100;