• Oracle实现主键字段自增


    Oracle实现主键自增有4种方式:
    1. Identity Columns新特性自增(Oracle版本≥12c)
    2. 创建自增序列,创建表时,给主键字段默认使用自增序列
    3. 创建自增序列,使用触发器使主键自增
    4. 创建自增序列,插入语句(insert)时,使用自增序列代替值
      数据库表名称为:userinfo(不能使用user,user为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)
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5

    测试:

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

    结果:
    在这里插入图片描述

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

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

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

    --设置自增序列,名称为"seq_userinfo",名字任意命名
    create sequence seq_userinfo
     increment by 1		--每次+1	
     start with 1		--1开始
     nomaxvalue			--不限最大值
     nominvalue			--不限最小值
     cache 20;			--设置取值缓存数为20
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    sequence各个参数详解,可以参考这边文章:
    参考文章

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

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

    –创建userinfo表

    CREATE TABLE userinfo (
      id number(11)  DEFAULT seq_userinfo.nextval, --"seq_userinfo"为自增序列名称
      name varchar2(20) ,
      age number(3)
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5

    测试:我使用的是DBeaver软件:

    如图:
    在这里插入图片描述

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

    如下:

    在这里插入图片描述

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

    建表语句:

    –创建userinfo表

    CREATE TABLE userinfo (
      id number(11)      not null,
      name varchar2(20) ,
      age number(3)
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5

    创建触发器(只需要注意注释的位置):

    -- 创建触发器,名称为"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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    测试:跟方式1测试一样,会存在不显示ID问题:

    如图:
    在这里插入图片描述

    重新打开页签:

    如下:
    在这里插入图片描述

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

    建表语句:

    –创建userinfo表

    CREATE TABLE userinfo (
      id number(11)      not null,
      name varchar2(20) ,
      age number(3)
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在插入语句中,自增的字段(ID),使用自增序列去代替

    如下:

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

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

    运行结果:

    在这里插入图片描述

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

    方式1和方式2最方便

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

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

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

    --删除自增序列,"seq_userinfo"为自增序列的名称
    drop sequence seq_userinfo
    --删除触发器,"userinfo_TRIGGER"为触发器名称
    drop trigger userinfo_TRIGGER
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    「Spring」认证安全架构指南
    5.2 磁盘CRC32完整性检测
    业务代码到底需不需要用多线程???
    Python中OpenCV库(二)
    面试问题整理总结
    从两个易错的笔试题深入理解自增运算符
    Qt学习11 Qt 中的字符串类
    Redis - String|Hash|List|Set|Zset数据类型的基本操作和使用场景
    string类
    【Python】设计模式
  • 原文地址:https://blog.csdn.net/qq_43709558/article/details/133309880