涉及到資訊系統,構建的資料模型中必定涉及主鍵,如何產生主鍵呢?
(1)不可取:獲取欄位的最大值加1。設計主鍵欄位為number型別的,每次錄入取得的最大值作為新記錄的標示。
改良方法(可取):在資料庫中構建序列,然後插入資料時候執行序列即可。如:
create sequence sequencenum --建序列
increment by 1 --增加為1
start with 1 --開始為1
maxvalue 99999999 --最大
錄入時候可以採取:insert into a(x)values(sequencenum.nextval),這樣就不會重複了。
同理:上面序列可以採取其他方法寫,這個只是最大值加1的方法。
這樣不可取的原因是:如果同時多人使用系統,所有人同時獲得了目前主鍵id的最大值為2,那麼同時錄入的id將為3,那麼會導致衝突問題。
(2)不可取:利用rowid作為主鍵。
不可取原因:因為rowid是偽列,是記錄的實際儲存空間的標示,如果將資料進行遷移等rowid會發生變化,那麼與之關聯的其他表中對應資料準確性無法保證。
(3)最好不用:sys_guid()系統給的函式。
最好不用的原因:sys_guid會保證它建立的識別符號在每個資料庫裡都是唯一的。對於sys_guid而言,效能上的影響在查詢時間和建立時間上(在**裡要建立更多的塊和索引以容納資料)sys_guid生成的值的另乙個顯著的不足之處是,管理這些值會變得困難得多。你必須(手動)輸入它們或者通過指令碼來填充它們,或者將它們作為web引數來傳遞。出於這些原因,將sys_guid作為乙個主關鍵字不是乙個很好主意,除非是在乙個並行的環境裡或者希望避免使用管理序列生成器的情況下。
(4)可取:dbms_random方法。
select dbms_random.string('a',10) from dual,採用10位的字元來表示,這樣重複機率很低。
insert into a(x) values('dbms_random.string('a',10)')
(5)自己寫產生隨機數的函式,這個方法最好,但是選擇好合適的演算法顯得尤為重要。
使用Hibernate主鍵產生器生成主鍵
本文講述如何使用使用hibernate主鍵產生器生成主鍵。主鍵由外部程式負責生成,無需hibernate參與。常用的資料庫,如oracle db2 sqlserver mysql 等,都提供了易用的主鍵生成機制。hibernate主鍵產生器 可選項說明 1 assigned 主鍵由外部程式負責生成,...
JPA的主鍵產生策略
generatedvalue 主鍵的產生策略,通過strategy屬性指定。主鍵產生策略通過generationtype來指定。generationtype是乙個列舉,它定義了主鍵產生策略的型別。1 auto 自動選擇乙個最適合底層資料庫的主鍵生成策略。如mysql會自動對應auto increme...
JPA的主鍵產生策略
generatedvalue 主鍵的產生策略,通過strategy屬性指定。主鍵產生策略通過generationtype來指定。generationtype是乙個列舉,它定義了主鍵產生策略的型別。1 auto 自動選擇乙個最適合底層資料庫的主鍵生成策略。如mysql會自動對應auto increme...