我已經爲我們的預訂系統編寫了發票模塊。MySQL自定義主鍵生成器
所以當我創建一個新的發票時,我會通過MySQL自動生成一個主鍵。
但是現在這只是一個簡單的整數加起來。
問題是我們有義務以#year例如「#year#id」的形式擁有發票號碼。 2013和#id是每年重新開始的id。
因此,例如, 20131,20132,2013和2014年將是20141,20142。
我該如何解決這個問題與自定義主鍵生成器?
我已經爲我們的預訂系統編寫了發票模塊。MySQL自定義主鍵生成器
所以當我創建一個新的發票時,我會通過MySQL自動生成一個主鍵。
但是現在這只是一個簡單的整數加起來。
問題是我們有義務以#year例如「#year#id」的形式擁有發票號碼。 2013和#id是每年重新開始的id。
因此,例如, 20131,20132,2013和2014年將是20141,20142。
我該如何解決這個問題與自定義主鍵生成器?
您可以在您的年份和ID中創建兩個字段。
在兩個字段上都創建一個主鍵,並給出auto_increment選項。 對於每個年份的唯一值,id將會計數。例如:
2012 1
2012 2
2012 3
2013 1
,並選擇時,你可以Concat的他們:SELECT CONCAT(年,ID)爲主要FROM表
插入將是:
INSERT INTO表SET年= YEAR(NOW ())
您不必指定id。
請注意,該表格必須是MyISAM才能運行http://dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html – Joni 2013-03-01 08:02:43
您應該使用程序或觸發器。 是建立你newInvoiceId的特定查詢應該是這樣的:
SELECT CONCAT(YEAR(now()),count(*)+1) as newInvoiceId
FROM table
WHERE InvoiceId like CONCAT(YEAR(now()),'%');
這裏我不是100%的信心是CONCAT(YEAR(now()),'%')
+1,適用於單線程解決方案。我也學到了 – 2013-03-01 07:41:21
對天真年警告的唯一部分/周像2012/01。年(現在())錯誤。
更好地使用YEARWEEK(NOW())
。給出了一個數字,如201201
下面顯示了今年不一定年的週數:
mysql> SELECT YEARWEEK('1987-01-01');
-> 198652
對於一個單個int有一年,一週休息,其實簡單。
int year = yearweek/100;
int week = yearweek % 100;
您想用java或本機sql來完成 – 2013-03-01 07:39:22
儘可能使用原生SQL。 – 2013-03-02 19:37:07