一、概述
在mysql中,创建表时可以使用auto_increment来指定一个列为自增列,那么oracle中怎么实现呢?
二、实验
在oracle中实现自增列可以有三种方法,以下分别介绍
1. 通过序列的方式
create sequence seq_test;
create table test1(id number default seq_test.nextval primary key, name varchar2(100));
该方法先创建一个序列,然后在创建表时,指定该序列的下一个值作为默认值。即使用 insert into test1(name) values(‘xx’)进行插入时,id的值就自动增加了。
这里有两点需要注意,一是如果显示的插入了一个id值,举例:使用insert into test1(id,name) values(5,‘xx’),当后面再使用不带id的insert语句时,如果序列的值增加到5,会报唯一性冲突。
第二点需要注意的是,即使insert语句插入失败,但是这个序列值依然会增加,因为序列的nextval已经执行了,只是后面的insert违反主键约束而已。
2. 通过生成列的方式
create table test2(id number generated as identity primary key, name varchar2(100));
这种方式并不需要手工创建序列,在insert into test2(name) values(‘xxx’)的时候,id的值会自增。那么这是一个什么原理呢,其实是数据库后台自动生成了一个自增序列,通过select * from user_sequences可以看到有一个ISEQ$$_138136的序列,这就是系统自动生成的。
这种方式需要注意的一点就是在insert的时候不能使用insert into test2(id,name) values(5,‘xx’)的方式,数据库后台会报ORA-32795: 无法插入到始终生成列。也就是说生成的列不能写在insert语句中,只能系统自动生成。
3. 通过触发器的方式
create table test3(id number primary key, name varchar2(100));
create sequence seq_test3;
create trigger t before insert on test3
for each row
begin
:new.id := seq_test3.nextval;
end;
/
注意通过此种方式,使用insert into(id,name) values(5,‘a’),5在插进去之前就被替换成了seq_test3.nextval,所以id带不带插入的结果都一样。
触发器的方式是最不优雅的,而且效率最低。




