1. 什麼是資料庫 資料庫是“按照數據結構來組織、存儲和管理數據的倉庫”。是一個長期存儲在電腦內的、有組織的、可共用的、統一管理的大量數據的集合。簡單的來說就像是一個大型的衣櫃,你所有春夏秋冬的衣服都被統一放在了一個衣櫃里,然後分類,分季節的有序擺放好。資料庫的優點重點在於體量足夠的大,一般的數據 ...
眾所周知,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;避免違反主鍵唯一約束。