Oracle实现主键字段自增-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
Oracle实现主键自增有4种方式
  1. Identity Columns新特性自增Oracle版本≥12c
  2. 创建自增序列创建表时给主键字段默认使用自增序列
  3. 创建自增序列使用触发器使主键自增
  4. 创建自增序列插入语句insert时使用自增序列代替值
    数据库表名称为userinfo不能使用useruser为Oracle关键字
方式一Identity Columns新特性自增

该种方式要求Oracle版本≥12c

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

  1. generated by default as IDENTITY
  2. 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各个参数详解可以参考这边文章
参考文章

方式二创建自增序列创建表时给主键字段默认使用自增序列

建表语句设置自增字段默认使用自增序列推荐该方式

–创建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
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: oracle