大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说oracle实现自增的方法和碰到的问题[亲测有效],希望您对编程的造诣更进一步.
众所周知,Oracle是没有办法像Mysql里用AUTO_INCREMENT实现自增的。
但是Oracle可以通过序列实现自增。
--以下是oracle 12c的方法 create sequence temp_seq increment by 1 start with 1001; --创建一个简单的序列 create table temp( id number default temp_seq.nextval primary key, name varchar2(20)
); --创建一个表 insert into temp(name) values("测试"); insert into temp(name) values("测试"); select * from temp;
但是这里有一个小问题,就是如果已存在该id,插入会报错,因为序列是一个跟表无关的对象。不会检查id,当id存在时,序列不会继续自动跳到下一个值。
如上图,当表已存在行id = 1005时,序列增加到1005时会违反主键约束,那么有没有一种可能,可以让这个序列跳到1006呢?
还得是触发器啊。
create sequence test_seq
increment by 1
start with 1001;
--用触发器获取此序列的值
create table test( id number default "0" primary key, name varchar2(20) ); --这里默认值设为0是判断使不使用序列
--当不使用序列时的插入是Insert into test (id,name) values("1234","测试");
--当使用序列时的插入是insert into test (name) values("测试");
create or replace trigger test_tri before insert on test for each row declare v_val number;
--定义v_val,当使用序列插入时,将序列值放到将变量中。 v_num number;
--定义v_num,判断插入时使不使用序列。 begin if :new.id = 0 then
--判断,当id使用的是默认值0时,代表使用序列 v_val:=test_seq.nextval; loop select count(id) into v_num from test where id = v_val;--查看test表的id列是否已存在跟序列相同的值,如果不存在,v_num = 0 。如果存在,v_num!=0; if v_num != 0 then v_val:=test_seq.nextval;--如果存在,则序列走一步。 end if; if v_num = 0 then exit;--如果不存在,则退出loop循环 end if; end loop; select v_val into :new.id from dual;--将序列值放进插入行,实现序列自增。 end if; end; /
--实现表自增功能触发器
如下图所示
以上第五次使用insert into test(name) values(“测试”);进行插入时,因为表里的id已存在1005了,所以触发器会循环一次,让序列走一下,变成1006;避免违反主键唯一约束。
原文地址:https://www.cnblogs.com/wfkfytmy/archive/2022/04/15/16147204.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5367.html