oracle为表格主键创建自增【伸手党福利】【趟坑】

主要针对主键自增 序列化
材料: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当中设计的每个表我都会放个自增主键的。

猜你喜欢

转载自blog.csdn.net/wwppp987/article/details/113007387