2013-03-01 111 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;