數據庫的ID自增字段代碼生成器——解決不同數據庫自增字段的差異機制
問題:
在設計數據庫字段時,有時需要一個int型的id主鍵,讓它能自動遞增,每次插入一條數據,它都能夠自動增1或者規定的自增數n。對於特定的數據庫,要實現這個很簡單,比如mysql是用auto_increment,Sql Server是用identity。但是如果在代碼中使用和特定數據庫有關的特性,那麼代碼就不能移植,比如把數據庫從mysql換成sql server,那麼代碼就要更改,就不能實現移植擴展。
解決思路:
既然要實現代碼的移植擴展,就不能使用和數據庫相關的特性,那該怎麼辦呢?這就是本篇要介紹的ID生成器。
思路是這樣的:在數據庫中另外建立一張表ID_Main,其包含兩個字段:一個字段是要實現ID自增的所屬表名(table_name),另一個字段是該表中自增字段對應的現在最大的記錄值(id_max)。假設現在要在數據表(user_info)中插入一條數據時,先使表ID_Main中對應字段table_name爲的user_info的id_max的值加1,然後再取出該值,就是自動增1後的值。以後每次要插入一條記錄,都會先使ID_Main表中對應的id值加1,再返回,其也就是保持了id的自增。
表ID_Main的設計如下:
/*==============================================================*/
/* Table: ID_Main */
/*==============================================================*/
create table ID_Main (
TABLE_NAME VARCHAR2(20) not null,
ID_MAX NUMBER(10) not null,
constraint PK_ ID_Main primary key (TABLE_NAME)
);
comment on table ID_Main is '用於維護各個表中的記錄條數';
以下就是代碼層,以Java分析爲例:
其中的DbUtility類是連接數據庫操作的封裝類,其代碼詳細參見《分頁技術原理與實現(二)》。代碼使用了connection的事務操作,保證事務的一致性,也就是當ID_MAX的值自增1時,應該在相應的表中插入一條記錄,以保證自增值一致。如果出錯,這應該回滾事務。
通過以上分析與代碼示例,就簡單的實現了一個IDGenerator即ID生成器,它與數據庫的特性隔離,實現了代碼層的移植性。