Oracle 實現主鍵自增


Oracle 實現主鍵自增

學過MySQL的都知道想要達到主鍵自增很簡單,只需要在創表時給字段加上 auto_increment 就可以達到自增的效果。

mysql> create table `demo`(
    -> id int(4)  auto_increment primary key,
    -> name varchar(4)
    -> );
Query OK, 0 rows affected (0.23 sec)

mysql> insert into demo(name) values('t1'),('t2'),('t3');
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from demo;
+----+------+
| id | name |
+----+------+
|  1 | t1   |
|  2 | t2   |
|  3 | t3   |
+----+------+
3 rows in set (0.00 sec)

重點來了,要是Oracle也這么簡單就好了,但是它就是不一樣!

它要實現自增需要我們手動去給字段加 序列

序列相關操作:

-- 創建序列
create sequence  序列名稱
start with  開始數字
increment by 增長數字
minvalue 最小值  --可選
maxvalue 最大值  --可選
cycle 是否循環(cycle為循環,nocycle為不循環)  --可選
nocache 不使用緩存  --可選


--查詢序列(利用nextval查詢序列下一次的值)
--第一次執行這條查詢語句得到結果為 開始數字+增長數字,再執行得到開始數字+增長數字+增長數字
select 序列名.nextval from dual;

 
--刪除序列
DROP SEQUENCE 序列名;


--注意:序列和表不是連接在一起的,當序列創建之后,用在這個表之后,我將該表刪除,但是序列的值還是停留在之前的值上
select seq_demo.nextval from dual;
   NEXTVAL
----------
         5
drop table demo;
表已刪除。
select seq_demo.nextval from dual;
   NEXTVAL
----------
         6

實現自增的方式

第一種實現主鍵自增的方法就是:序列+顯式化調用 序列名.nextval 進行自增

SQL> create table demo(
  2  id number ,
  3  name varchar2(4)
  4  );

表已創建。

SQL> create sequence seq_demo
  2  start with 1
  3  increment by 1;

序列已創建。

SQL> insert into demo values(seq_demo.nextVal , 'o1');
已創建 1 行。
SQL> insert into demo values(seq_demo.nextVal , 'o2');
已創建 1 行。

SQL> select * from demo;
        ID NAME
---------- --------
         1 o1
         2 o2

SQL> insert into demo values(seq_demo.nextVal , 'o3');
已創建 1 行。

SQL> select * from demo;
        ID NAME
---------- --------
         1 o1
         2 o2
         3 o3

第二種實現主鍵自增的方法就是:利用序列 + 觸發器 進行主鍵自增

觸發器創建格式

create [or replace] tigger 觸發器名
觸發時間 觸發事件
on 表名
  [for each row]
begin
  pl/sql語句
end 觸發器名

練習:

create or replace trigger tri_demo_insert  --創建觸發器並命名
before insert on DEMO       --觸發時間為向表DEMO中插入時
referencing old as old new as new 
 for each row   --對表的每一行觸發一次,否則只對整表執行一次
begin
select seq_demo.nextval
 into :new.ID
 from dual;
end tri_demo_insert;


insert into DEMO (ID,Name) values(10,'一');
insert into DEMO (Name) values('二');
insert into DEMO  values(9,'三');
insert into DEMO values(6,'四');

select * from DEMO;

        ID NAME
---------- --------
         1 一
         2 二
         3 三
         4 四
         
可以看出,創建了觸發器后。不管我們是否插入自增字段(id)或者插入不符觸發規則的數據,它都會按照觸發器規則添加數據。         

總結: Oracle想要自增就是比MySQL麻煩,不管使用以上哪種方式 ,序列是必須要創建的


免責聲明!

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



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