溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Oracle創(chuàng)建自增長主鍵的方法

發(fā)布時(shí)間:2020-06-23 18:03:46 來源:億速云 閱讀:145 作者:元一 欄目:MySQL數(shù)據(jù)庫

這篇文章將為大家詳細(xì)講解有關(guān)Oracle創(chuàng)建自增長主鍵的方法,文章內(nèi)容質(zhì)量較高,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

Oracle創(chuàng)建自增長的步驟:

創(chuàng)建自增長序列

-- 創(chuàng)建自增長序列
create sequence seq_on_chance_contract
increment by 1 -- 每次加1
start with 1 -- 從1開始計(jì)數(shù)
nomaxvalue -- 不設(shè)置最大值
nocycle -- 一直累加
nocache;

創(chuàng)建數(shù)據(jù)表

主鍵可以使用INTEGER和NUMBER,若系統(tǒng)使用Hibernate作為ORM框架則不推薦使用NUMBER

create table TBL_CHANCE_CONTRACT
(
  ID                INTEGER  PRIMARY KEY,
  CHANCE_SUCCESS_ID VARCHAR2(50) not null,
  CONTENT           CLOB,
  CREATE_USER_ID    VARCHAR2(50),
  CREATA_USER_NAME  VARCHAR2(80),
  CREATE_DATE       TIMESTAMP(6)
)

創(chuàng)建主鍵觸發(fā)器,以便新增記錄的時(shí)候不需要管理ID主鍵

-- 創(chuàng)建主鍵觸發(fā)器  
CREATE OR REPLACE TRIGGER tg_on_id_chance_contract 
       BEFORE INSERT ON TBL_CHANCE_CONTRACT FOR EACH ROW WHEN (new.ID is null)
BEGIN
       SELECT seq_on_chance_contract.nextval into:new.ID from dual;
END;

一些小技巧:

查看所有的序列、表

-- 查找所有SEQUENCE、TABLE
select * from user_objects ubs;
-- 查找所有SEQUENCE
select * from user_objects ubs where ubs.OBJECT_TYPE='SEQUENCE';

查看當(dāng)前序列到了多少

select seq_on_chance_contract.nextval from dual;
select seq_on_chance_contract.currval from dual;

重置序列

一般重置序列是需要?jiǎng)h除序列然后重建,但是這樣比較麻煩,在不刪除序列的情況下有以下2中方式:

1、利用步長參數(shù),先查出sequence的nextval,記住,把遞增改為負(fù)的這個(gè)值(反過來走),然后再改回來。

假設(shè)需要修改的序列名seq_on_chance_contract

-- 重置序列
select seq_on_chance_contract.nextval from dual;        -- 假設(shè)得到結(jié)果 n
alter sequence seq_on_chance_contract increment by -2;  -- 注意是 -(n-1) 
select seq_on_chance_contract.nextval from dual;        -- 再查一遍,走一下,重置為1了 
alter sequence seq_on_chance_contract increment by 1;   -- 還原

2、利用存儲(chǔ)過程實(shí)現(xiàn) (v_seqname)

create or replace procedure seq_reset(v_seqname varchar2) as n number(10); 
tsql varchar2(100); 
begin 
execute immediate 'select '||v_seqname||'.nextval from dual' into n; 
n:=-(n-1); 
tsql:='alter sequence '||v_seqname||' increment by '|| n; 
execute immediate tsql; 
execute immediate 'select '||v_seqname||'.nextval from dual' into n; 
tsql:='alter sequence '||v_seqname||' increment by 1'; 
execute immediate tsql; 
end seq_reset;

然后調(diào)用存儲(chǔ)過程:  

exec seq_reset('v_seqname');

主鍵(primary key)是表中的一個(gè)或多個(gè)字段,它的值用于唯一地標(biāo)識(shí)表中的某一條記錄。 Oracle主鍵常用的分為UUID和自增長int兩種,下面簡(jiǎn)單說下各自的優(yōu)缺點(diǎn)。

UUID的優(yōu)點(diǎn)

1、生成方便,不管是通過sys_guid() 還是java的uuid都能很方便的創(chuàng)建UUID。

2、適合批量數(shù)據(jù)中的插入和更新操作。

3、跨服務(wù)器數(shù)據(jù)合并非常方便。

INT自增長的優(yōu)點(diǎn)

1、占用空間小

2、性能好,UUID跟int比起來不在一個(gè)級(jí)別上

3、容易記憶

他們各自的優(yōu)點(diǎn)就是彼此的缺點(diǎn)

適用范圍:

一般在分布式環(huán)境中使用UUID作為唯一主鍵,至于其他項(xiàng)目本人強(qiáng)烈建議使用int作為主鍵。

PS:最近我的一個(gè)分布式項(xiàng)目在周末訪問高峰期也是會(huì)出現(xiàn)UUID重復(fù)的情況,所以UUID號(hào)稱的全球唯一ID這個(gè)優(yōu)點(diǎn)我沒寫上去,而我們可以使用Zookeeper作為主鍵生成器創(chuàng)建int類型的唯一主鍵,這是完全沒有問題的。

所以綜上我還是建議所有的主鍵都應(yīng)該使用int類型,在千萬級(jí)別的數(shù)據(jù)量上int類型的優(yōu)點(diǎn)尤為明顯。

以上就是Oracle創(chuàng)建自增長主鍵的方法,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊,感謝各位的閱讀。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI