MySQL自定义主键生成器

时间:2013-03-01 07:29:59

标签: java mysql primary-key generator

我已为我们的预订系统编写了发票模块。

因此,当我创建新发票时,我会通过MySQL自动生成主键。

但目前这只是一个简单的整数计数。

问题是我们有义务以“#year#id”的形式提供发票号,其中#year是例如2013年和#id是每年从1开始的ID。

所以,例如20131年,20132年,20133年和2014年将是20141年,2014年。

如何使用自定义主键生成器解决此问题?

3 个答案:

答案 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;