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麻烦,不管使用以上哪种方式 ,序列是必须要创建的。