1. 程式人生 > >Oracale序列是什麼?:通過一個用序列+觸發器實現主鍵自增的例項來說明

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;//結束本次觸發