2014-09-19 104 views
1

我有證書的數據庫(MySQL的),每一個用代碼標識,格式如下:自動遞增列其重置每年

year - number

,其中今年是最後兩位數字獲得證書的年份,Number是一個五位數的遞增數字(例如,14-12345)。每年,號碼部分必須重置。所以2015年的第一個證書將是15-00001。 我的問題是與代碼的「數字」部分。在我的應用

SELECT MAX(Number) FROM certificates WHERE Year = YEAR(NOW()) 

然後,在另一份聲明中,像這樣的(僞代碼,以簡化):現在我在做這個

INSERT INTO certificates (Year, Number) VALUES (YEAR(NOW()), ++Number) 

一個循環內,插入多個新證書。

這是有效的,但在併發插入方面不太安全。也許我可以使用交易,但我認爲還有更好的辦法。

我想在另一個表中的自動遞增值和主表內的外鍵,但我不知道如何重置每一年的變化。

+1

對錶中的主鍵使用自動遞增的整數。通過觸發器使證書代碼成爲您維護的另一列。 – 2014-09-19 14:14:19

回答

0

您可以在表Certificates(可能已經有一個用於鍵)中使用自動增量字段(ID),並且您可以收集有關每年插入的最後一個ID(LastIDYear)的信息的表格。

你的年數字段是一個計算字段,其中數字部分是:

ID - (去年插入ID)。在上面的附加表(LastIDYear)中找到了去年插入的ID。您可以加入年份列中的表格來查找所有您需要的信息。

您可能在序列中缺少編號..但我認爲在年份編號證書描述中沒有完整序列是必需的。

+0

MySql不支持計算列(我認爲),但你把我放在正確的路上。我可以爲此觀點。謝謝 :) – 2014-09-19 15:23:49

0

每個新的一年第一次執行查詢:

SELECT MAX(Number) FROM certificates WHERE Year = YEAR(NOW()) 

的結果將是一個NULL
添加一張支票,並在其中獲得一個NULL,您將其替換爲1。

+0

我忘了說,我已經在做這個檢查:) – 2014-09-19 14:47:06