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