主要针对主键自增 序列化
材料:oracle 11g Navicat或plsql
创建表
CREATE TABLE 表名
(
id INT NOT NULL,
key1 VARCHAR2(40) NULL,
key2 VARCHAR2(40) NULL
);
创建主键
alter table 表名 add constraint demo6_pk primary key (id);
正式开始
1、创建序列
注意:seq_test为序列名字start with
这行注意起始数字,如果已有数据的话要填写一个合适的数字
drop sequence seq_test;
create sequence seq_test;
increment by 1
start with 1//你想要的值
maxvalue 99999999999;
标准:
create sequence 序列名
minvalue 1
nomaxvalue
increment by 1
start with 1
nocache;
2、新建触发器
这里用id作为主键
create or replace trigger 序列名
before insert on 表名 for each row
begin
select 序列名.Nextval into:new.id from dual;
end;
3、检测方法
创建一条输入,里面没有id即可
insert into demo6 (key1, key2) values ('key1', 'key2');
4、查询当前序列值
select 序列名.currval from dual;
5、序列值的起始值设定错了怎么办?
网上将这个叫做 跳数
Oracle修改序列当前值的两种方式
1、直接drop sequence seq_test;然后重新创建并且设置序列的初始值为希望的数据
drop sequence seq_test;
create sequence seq_test;
increment by 1
start with 1//你想要的值
maxvalue 999999999;
2、修改序列的每次增加的值,然后再修改回每次自增1
比如将每次自增1修改为每次自增99,这样做一次nextval也能得到预想的值,然后再将每次自增再次修改为1;
alter sequence seq_test increment by n; --n为做自增能够达到预想的值
select seq_test.nextval from dual; -- 做一次nextval也能得到预想的值
alter sequence seq_test increment by 1; -- 再将序列的自增值修改回去
【伸手党请用】总结示例:
--创建序列
create sequence SEQ_ID
minvalue 1
maxvalue 99999999
start with 1
increment by 1
nocache
order;
--建解发器代码为:
create or replace trigger tri_test_id
before insert on S_Depart --S_Depart 是表名
for each row
declare
nextid number;
begin
IF :new.DepartId IS NULL or :new.DepartId=0 THEN --DepartId是列名
select SEQ_ID.nextval --SEQ_ID正是刚才创建的
into nextid
from sys.dual;
:new.DepartId:=nextid;
end if;
end tri_test_id;
参考:
https://www.cnblogs.com/xiaostudy/p/10062491.html
https://blog.csdn.net/weixin_42134712/article/details/109050998
https://www.cnblogs.com/mq0036/p/13151770.html
写在最后:
说实话,没想到oracle自增这么麻烦,mysql当中设计的每个表我都会放个自增主键的。