跟mysql,sqlserver不同,oracle没有auto_increment
oracle实现自动增长的方式叫序列。
序列不属于表,跟表没有直接绑定的关系,是属于用户的。你创建好了,用就可以了。
查询序列:select * from user_sequences 得到的结果就是你登录的当前用户下的所有序列记录
每条记录对应某一张表的序列,因为是直接拿来用的关系,因此要区分哪个序列属于哪个表,那么创建序列取名的时候就别乱取了
比如我创建一个表student的序列名叫student_Sequence
创建序列:
1.前提准备,用户得有创建的权限 CREATE SEQUENCE或者CREATE ANY SEQUENCE
2.创建语法
CREATE SEQUENCE seqname [ INCREMENT increment ]
[ MINVALUE minvalue ] [ MAXVALUE maxvalue ]
[ START start ] [ CACHE cache ] [ CYCLE ][order]
例子:
CREATE SEQUENCE seqName--序列名
minvalue 1 --最小值
INCREMENT BY 1 --递增1
START WITH 1 --从1开始
NOMAXvalue --无最大值
NOCYCLE --不循环
CACHE 100; --缓存100个序列号
表里没数据时创建序列:https://blog.csdn.net/weixin_44282540/article/details/90806301
表里已经有数据时,新增一个主键列,添加序列:https://blog.csdn.net/qq_24583825/article/details/72484112
create sequence student_SEQ
minvalue 1
maxvalue 9999
increment by 1
start with 1
nocycle
nocache
使用序列:
语法:
序列名.[currval/nextval]
currval:表示当前值,新序列若没使用过nextval不能直接使用当前值,会报错;
nextval:表示序列的下一个值
例:查询序列的值
select seq_name.nextval from dual; --序列seq_name的下一个值
例:SQL语句中使用序列
insert into 表名 value(seq_name.currval)
hebernate注解:
@Id
@SequenceGenerator(name="req",sequenceName="seq_name")
@GeneratedValue(generator="req")
private Integer StudengID;
参考https://www.jb51.net/article/144519.htm
语法:
drop sequence [用户名.]序列名
例:删除序列
dorp sequence seq_name;
alert sequence [用户名.]序列名 [可选参数]
例:修改序列
alert sequence seq_name
increment by 10
nomaxvalue
nocycle
cache 10
(修改序列只能修改这几个值,不能修改初始值)
修改last_number
select * from user_sequences t where t.sequence_name ='student_req'
alter sequence student_reqincrement by 20 nocache
select student_req.nextval from dual;
alter sequence student_reqincrement by 1 cache 20
最简单的是重新创建序列,start with 指定最后数值