2013-03-01 75 views
1

我已经为我们的预订系统编写了发票模块。MySQL自定义主键生成器

所以当我创建一个新的发票时,我会通过MySQL自动生成一个主键。

但是现在这只是一个简单的整数加起来。

问题是我们有义务以#year例如“#year#id”的形式拥有发票号码。 2013和#id是每年重新开始的id。

因此,例如, 20131,20132,2013和2014年将是20141,20142。

我该如何解决这个问题与自定义主键生成器?

+0

您想用java或本机sql来完成 – 2013-03-01 07:39:22

+0

尽可能使用原生SQL。 – 2013-03-02 19:37:07

回答

2

您可以在您的年份和ID中创建两个字段。

在两个字段上都创建一个主键,并给出auto_increment选项。 对于每个年份的唯一值,id将会计数。例如:

2012 1 
2012 2 
2012 3 
2013 1 

,并选择时,你可以Concat的他们:SELECT CONCAT(年,ID)为主要FROM表

插入将是:

INSERT INTO表SET年= YEAR(NOW ())

您不必指定id。

+1

请注意,该表格必须是MyISAM才能运行http://dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html – Joni 2013-03-01 08:02:43

2

您应该使用程序或触发器。 是建立你newInvoiceId的特定查询应该是这样的:

SELECT CONCAT(YEAR(now()),count(*)+1) as newInvoiceId 
FROM table 
WHERE InvoiceId like CONCAT(YEAR(now()),'%'); 

这里我不是100%的信心是CONCAT(YEAR(now()),'%')

+0

+1,适用于单线程解决方案。我也学到了 – 2013-03-01 07:41:21

0

对天真年警告的唯一部分/周像2012/01。年(现在())错误。

更好地使用YEARWEEK(NOW())。给出了一个数字,如201201

下面显示了今年不一定年的周数:

mysql> SELECT YEARWEEK('1987-01-01'); 
     -> 198652 

对于一个单个int有一年,一周休息,其实简单。

int year = yearweek/100; 
int week = yearweek % 100;