一、问题描述
Oracle中执行插入语句报错:【ORA-02289: 序列不存在】
//这就是报错的插入语句
insert into ScadaDeviceList (DeviceId, DeviceNumber) values (SEQ_DeviceList.NextVal,'SCADA01')
二、问题分析
分析:当前执行的插入语句中用到了自增序列,但是数据库中没有创建自增序列【SEQ_DeviceList】。
三、解决办法
直接创建自增序列【SEQ_DeviceList】即可,执行语句如下:
CREATE SEQUENCE SEQ_DeviceList
START WITH 80
INCREMENT BY 1
NOMINVALUE
MAXVALUE 9999999999999999999999999
NOCYCLE
NOORDER
CACHE 100;
四、补充知识
4.0、序列介绍
序列【sequence】是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。其主要的用途是生成表的主键值。
4.1、查看所有序列
//查看所有序列
select * from user_sequences
4.2、创建序列
①必须具备:创建序列的权限 create sequence 或 create any sequence;
②创建序列的语法
CREATE SEQUENCE sequenceName //创建的序列名称
[START WITH n] //开始的值,递增默认是minvalue 递减是maxvalue
[INCREMENT BY n] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1
[{MAXVALUE n | NOMAXVALUE}] //最大值
[{MINVALUE n | NOMINVALUE}] //最小值
[{CYCLE | NOCYCLE}] //循环/不循环一直累加到最大值
[{CACHE n | NOCACHE}];//分配并存入到内存中
Cycle 循环 nocycle 不循环
Cache 缓存 //一般不采用缓存
Nextvalue 下一个
Currval 当前值
③示例:创建名为【SEQ_DeviceList】的序列,从80开始,每次增加1,没有最小值;最大值为:999999,不循环,分配100个存入内存中。
CREATE SEQUENCE SEQ_DeviceList
START WITH 80
INCREMENT BY 1
NOMINVALUE
MAXVALUE 999999
NOCYCLE
NOORDER
CACHE 100;
4.3、删除序列
//删除指定名称的序列
DROP sequence 序列名称
4.4、使用场景
①INSERT语句的VALUES中
//插入语句中的DeviceId使用自增序列
insert into ScadaDeviceList (DeviceId, DeviceNumber) values (SEQ_DeviceList.NextVal,'SCADA01')
②UPDATE 的 SET中
UPDATE ScadaDeviceList SET DeviceId=SEQ_DeviceList.Currval WHERE DeviceNumber= 'SCADA01'