Oracale序列是什麼?:通過一個用序列+觸發器實現主鍵自增的例項來說明
一.Oracle序列是幹嘛的?
為表中的行自動生成唯一的序列號,從而實現主鍵自增;
二.為什麼要在Oracle中使用序列?
像mysql中的資料庫表中的主鍵值都可以在建立表的時候,
通過設定自增就能夠很容易實現。
但是oracle中沒有設定自增的方法,
解決這個情況通常就會使用序列+觸發器來實現主鍵自增。
建立的序列和觸發器都可以在pl/sql中的squence資料夾和trigger資料夾來檢視。
三.基本的SQL語句瞭解一下(看懂就行,實際操作不用):
①比如,生成一個序列生成器的模板SQL:
//該語法用來建立一個序列生成器
CREATE SEQUENCE 序列名
//下面是配置這個序列生成器
INCREMENT BY n//自增間隔;正值表示遞增負值表示遞減
START WITH n//從多少開始,預設值是1
MAXVALUE/MINVALUE n|NOMAXVALUE(把多於的符號刪了)//極限值
CYCLE|NOCYCLE//達到極限值是否迴圈
CACHE n| NOCACHE; //設定存放序列的記憶體塊的大小
②對應的例項如下:
1.建立一個序列的SQL語句:
CREATE SEQUENCE seq_newsId//不是子句
INCREMENT BY 1//一句話中的必要成分而已
START WITH 1//還加什麼標點呢?
MAXVALUE 999999999;
2.查詢該序列的SQL語句:
SELECT seq_newsid.nextval
FROM sys.dual;
3.刪除該序列的SQL語句:
DROP SEQUENCE seq_newsId;
四.實際應用:實現欄位主鍵自增:
以上這些只做為理論上的瞭解,實際應用中,直接藉助pl/sql工具來實現:
比如實現一張表的主鍵自增操作步驟如下:
1.找到Tables資料夾右鍵建立一個表並設定一個欄位為主鍵,數字型別
2.找到Squences資料夾右鍵新建,來新建一個sequence:S_t_person
3.手動執行序列引用SQL語句檢視序列是否讓主鍵能夠自增:
例如:
insert into t_person(personId,personname,personorder)values(S_t_person.Nextval,'wang',1);
將該語句執行3次,檢視personId是否有值,值是否遞增;
如果有值且自增了,就說明序列引用成功了;
這裡存在一個問題:
問題產生的場景是,在plsql中我手動新增personname,personorder後,一提交發現personId並沒有自動增加
怎麼解決這個問題呢?用觸發器 怎麼玩呢?看第4步
4.直接複製貼上下面這段SQL語句,做下修改最後執行一下就行了:
create or replace trigger tri_test_id//建立一個觸發器:tri_test_id,如果已經存在就替換掉原來的
before insert on t_person
for each row //每一行
declare
nextid number;//宣告一個number型的nextid
begin//只要發生插入事務,就開始觸發
IF :new.personId IS NULL or :new.perosnId=0 THEN //如果該行的personId為空那麼
select S_t_person.nextval
into nextid
from sys.dual;//就把序列的下一個值賦值個之前建立的nextid
:new.personId:=nextid;//然後把這個nextid再賦值給該行的personId,自然就能夠在plsql中顯示出來
end if;
end tri_test_id;//結束本次觸發