2017-08-16 84 views
0

我想從mySQL Auto Increment生成Bill No。我有列ID(主鍵&自動遞增)。現在從此列ID我正在生成帳單否按用戶請求。問題是如果我刪除了一些記錄,那麼當輸入新記錄時,它不應該跳過已刪除的ID。MySQL自動增量跳過刪除號碼

例如1001,1002,1003,1004等在這個,如果我刪除記錄Id 1002 &下一次如果我輸入任何新的記錄,那麼我怎麼能指派1002回到新的記錄。

+0

真的沒有你想要做這件事情的情況 – Strawberry

回答

3

當新的記錄被輸入

是的,它應該把它不應該跳過刪除ID。你只是依靠這個系統來做一些從未設計過,從未聲稱過的事情。

AUTOINCREMENT不適用於生成「帳單號」。它旨在通過永不重複使用值來生成不斷增加的標識符並保證唯一性。它正是這樣做的。

您可以使用您喜歡的任何邏輯手動生成「Bill No」,並將其存儲在另一列中。但重用價值會很奇怪。設想一下,如果您向某人發出賬單,稍後刪除該記錄,然後向另一個具有相同號碼的人發出賬單。

唯一性對標識符很重要。

+0

很好的解釋。很多ppl不知道數據庫爲什麼使用auto_increment以及這是多麼重要。 – Noob

+0

是的,我同意自動增量僅用於唯一數據。我的意思是我不完全依靠ID來生成帳單號。我已經應用ID前綴邏輯來生成發票號。不過,我也希望將ID列值附加到我的賬單號碼中。在我們的行業,我們需要保留每一個數字的記錄。如果任何數字在執行刪除後跳過,我們會因此而受到處罰。如果不可能,你能建議我應該採用什麼邏輯? – SUN

+0

@SUN:如果您的行業有自定義要求,那麼您需要應用自定義邏輯來生成帳單編號。也許某種函數通過查看現有記錄並找到第一個空數字?任何方法在性能方面都不盡如人意。我懷疑通過簡單地不刪除記錄就能更好地滿足行業要求。這可能是行業要求的實際意圖。如果記錄發生錯誤,請發出第二個更正記錄。不要刪除它們。 – David

1

從財務管理的角度來看,能夠刪除和重新使用發票號碼會損害您的審計線索並使您面臨風險。同樣從數據庫完整性的角度來看,不允許重用主鍵,因爲它會導致意外的結果,例如其他表中的記錄在連接中出現錯誤。數據庫通過不允許重用主鍵來保護其參照完整性,事實上,正如@David在他的回覆中所說的,主鍵上自動增量的一部分功能是保持密鑰的唯一性

現在對於解決方案來說,從財務角度來看,發票永遠不應該被刪除,因此存在審計線索,不正確的發票應該通過信用票據進行反制。 '刪除'記錄並重新使用發票號碼,我會建議爲發票號碼設置不同的字段,而不是實際刪除,但是使用一個字段來標記活動或刪除,並且保留一個單獨的遞增發票號碼。將至少有助於維護您的記錄的完整性