ToB企服应用市场:ToB评测及商务社交产业平台

标题: Oracle实现主键自增有4种方式 [打印本页]

作者: 道家人    时间: 2024-6-9 13:31
标题: Oracle实现主键自增有4种方式
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
文章知识点与官方知识档案匹配,可进一步学习相关知识

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4