oracle實現自增的方法和碰到的問題


眾所周知,Oracle是沒有辦法像Mysql里用AUTO_INCREMENT實現自增的。

但是Oracle可以通過序列實現自增。

--以下是oracle 12c的方法

create sequence temp_seq
increment by 1
start with 1001;
--創建一個簡單的序列
create table temp(
id number default temp_seq.nextval primary key,
name varchar2(20)
);
--創建一個表 insert into temp(name) values('測試'); insert into temp(name) values('測試'); select * from temp;

但是這里有一個小問題,就是如果已存在該id,插入會報錯,因為序列是一個跟表無關的對象。不會檢查id,當id存在時,序列不會繼續自動跳到下一個值。

如上圖,當表已存在行id = 1005時,序列增加到1005時會違反主鍵約束,那么有沒有一種可能,可以讓這個序列跳到1006呢?

還得是觸發器啊。

create sequence test_seq
increment by 1
start with 1001;
--用觸發器獲取此序列的值

create table test( id number
default '0' primary key, name varchar2(20) ); --這里默認值設為0是判斷使不使用序列
--當不使用序列時的插入是Insert into test (id,name) values('1234','測試');
--當使用序列時的插入是insert into test (name) values('測試');
create or replace trigger test_tri before insert on test
for each row declare v_val number;
     --定義v_val,當使用序列插入時,將序列值放到將變量中。 v_num number;
     --定義v_num,判斷插入時使不使用序列。 begin
if :new.id = 0 then
    --判斷,當id使用的是默認值0時,代表使用序列 v_val:
=test_seq.nextval; loop select count(id) into v_num from test where id = v_val;--查看test表的id列是否已存在跟序列相同的值,如果不存在,v_num = 0 。如果存在,v_num!=0; if v_num != 0 then v_val:=test_seq.nextval;--如果存在,則序列走一步。 end if; if v_num = 0 then exit;--如果不存在,則退出loop循環 end if; end loop; select v_val into :new.id from dual;--將序列值放進插入行,實現序列自增。 end if; end; /
--實現表自增功能觸發器

 如下圖所示

以上第五次使用insert into test(name) values('測試');進行插入時,因為表里的id已存在1005了,所以觸發器會循環一次,讓序列走一下,變成1006;避免違反主鍵唯一約束。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM