首頁 >資料庫 >mysql教程 >Oracle如何建立自增長主鍵

Oracle如何建立自增長主鍵

angryTom
angryTom轉載
2019-11-27 14:02:512755瀏覽

Oracle如何建立自增長主鍵

Oracle如何建立自成長主鍵

Oracle主鍵常用的分為UUID和自增長int兩種,以下簡單說下各自的優缺點:

UUID的優點

1、生成方便,不管是透過sys_guid() 還是java的uuid都能很方便的建立UUID。

2、適合批量資料中的插入和更新操作。

3、跨伺服器資料合併非常方便。

INT自增長的優點

1、佔用空間小

2、效能好,UUID跟int比起來不在一個層級上

3、容易記憶

他們各自的優點就是彼此的缺點

推薦《mysql影片教學》  

適用範圍:

一般在分散式環境中使用UUID作為唯一主鍵,至於其他項目本人強烈建議使用int作為主鍵。

PS:最近我的一個分散式專案在週末訪問高峰期也是會出現UUID重複的情況,所以UUID號稱的全球唯一ID這個優點我沒寫上去,而我們可以使用Zookeeper作為主鍵生成器創建int類型的唯一主鍵,這是完全沒有問題的。

所以綜上我還是建議所有的主鍵都應該使用int型,在千萬等級的資料量上int型別的優點特別明顯。

Oracle建立自成長的步驟:

建立自成長序列

-- 创建自增长序列
create sequence seq_on_chance_contract
increment by 1 -- 每次加1
start with 1 -- 从1开始计数
nomaxvalue -- 不设置最大值
nocycle -- 一直累加
nocache;

建立資料表

主鍵可以使用INTEGER和NUMBER,若係統使用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)
)

建立主鍵觸發器,以便新增記錄的時候不需要管理ID主鍵

-- 创建主键触发器  
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';

查看目前序列到了多少

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

重置序列

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

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

假設需要修改的序列名稱seq_on_chance_contract

-- 重置序列
select seq_on_chance_contract.nextval from dual;        -- 假设得到结果 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、利用預存程序實作(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;

然後呼叫預存程序:  

exec seq_reset('v_seqname');

本文來自php中文網,mysql教學欄目,歡迎學習!  

以上是Oracle如何建立自增長主鍵的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除