博客 Oracle实现主键自增有4种方式

Oracle实现主键自增有4种方式

   数栈君   发表于 2023-09-01 10:48  232  0

Oracle实现主键自增有4种方式:

Identity Columns新特性自增(Oracle版本≥12c)
创建自增序列,创建表时,给主键字段默认使用自增序列
创建自增序列,使用触发器使主键自增
创建自增序列,插入语句(insert)时,使用自增序列代替值
数据库表名称为:userinfo(不能使用user,user为Oracle关键字)

方式一:Identity Columns新特性自增
该种方式要求Oracle版本≥12c

在自增字段后使用以下2种语句的1种:

generated by default as IDENTITY
generated always as identity
建表语句:

CREATE TABLE userinfo (
id number(11) generated by default as IDENTITY,--使用自增功能
name varchar2(20) ,
age number(3)
)
测试:

INSERT INTO USERINFO (name,age) VALUES('张三',18)


该种方式很简单,底层原理其实和下面3种方式相似,只是Oracle帮我们省去了多余的操作。

以下是剩余的3种方式,都用共同的特点(先创建自增序列):

准备工作:
必须先创建自增序列:

--设置自增序列,名称为"seq_userinfo",名字任意命名
create sequence seq_userinfo
increment by 1 --每次+1
start with 1 --从1开始
nomaxvalue --不限最大值
nominvalue --不限最小值
cache 20; --设置取值缓存数为20
sequence各个参数详解,可以参考这边文章:

Oracle中sequence(序列)详解_睡竹的博客-CSDN博客
Oracle中sequence(序列)详解cache的作用及优缺点
https://blog.csdn.net/weixin_42675423/article/details/127101723

方式二:创建自增序列,创建表时,给主键字段默认使用自增序列
建表语句,设置自增字段默认使用自增序列(推荐该方式):

--创建userinfo表
CREATE TABLE userinfo (
id number(11) DEFAULT seq_userinfo.nextval, --"seq_userinfo"为自增序列名称
name varchar2(20) ,
age number(3)
);
测试:我使用的是DBeaver软件:

注意:新增了一条数据,点击保存,该软件并不会立刻自动显示生成的ID,我们需要关闭当前页签,再打开就可以看到自增的ID了

如下:

方式三:创建自增序列,使用触发器使主键自增
建表语句:

--创建userinfo表
CREATE TABLE userinfo (
id number(11) not null,
name varchar2(20) ,
age number(3)
);
创建触发器(只需要注意注释的位置):

--创建触发器,名称为"deptinfo_TRIGGER",名字任意命名
create or replace trigger userinfo_TRIGGER
before insert on userinfo --"userinfo"为表名称
for each row
begin
select seq_userinfo.nextval into :new.id from dual; --1、"seq_userinfo"为自增序列名称 2、这里的id是你需要自增的序列
end userinfo_TRIGGER; --"userinfo_TRIGGER"为触发器名称
测试:跟方式1测试一样,会存在不显示ID问题:

如图:

重新打开页签:

如下:

方式四:创建自增序列,插入语句(insert)时,使用自增序列代替值
建表语句:

--创建userinfo表
CREATE TABLE userinfo (
id number(11) not null,
name varchar2(20) ,
age number(3)
);
在插入语句中,自增的字段(ID),使用自增序列去代替

如下:

INSERT INTO userinfo(id,name,age) VALUES(seq_userinfo.nextval,'睡竹',18);

注意:方式三与MySQL、微软的SQL server的自增方式是一样的!

运行结果:

总结:
对后台系统开发来说:

方式1和方式2最方便

方式3还需要新加一个触发器,不推荐

方式4类似于方式2,但是对Java程序而言,mybatis的xml需要显式的指定触发器,不够友好

附上删除触发器和自增序列的语句:

--删除自增序列,"seq_userinfo"为自增序列的名称
drop sequence seq_userinfo
--删除触发器,"userinfo_TRIGGER"为触发器名称
drop trigger userinfo_TRIGGER



免责申明:


本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!

《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu

《数栈V6.0产品白皮书》下载地址:
https://fs80.cn/cw0iw1

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:
https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:
https://github.com/DTStack

0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群