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麻煩,不管使用以上哪種方式 ,序列是必須要創建的。