• Oracle通过序列+触发器实现主键自增


        接触oracle没多久,在建表的时候发现还不会如何设置主键自动增长。和mysql的设置为AUTO_INCREMENT属性相比,要复杂很多,所以现在记录起来。

        我使用的是序列+触发器的方式。

        现在已经创建好一个tbl_dept表,比较简单就两个字段。建表语句如下:

    -- Create table
    create table TBL_DEPT
    (
      dept_id   INTEGER not null,
      dept_name VARCHAR2(255) not null
    )
    tablespace SYSTEM
      pctfree 10
      pctused 40
      initrans 1
      maxtrans 255
      storage
      (
        initial 128K
        next 1M
        minextents 1
        maxextents unlimited
      );
    -- Create/Recreate primary, unique and foreign key constraints 
    alter table TBL_DEPT
      add constraint PK_DEPT primary key (DEPT_ID)
      using index 
      tablespace USERS
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 64K
        next 1M
        minextents 1
        maxextents unlimited
      );

      表有了之后我们首先需要创建一个用来实现自动增长的序列:

    create sequence sql_dept
    minvalue 1        --最小值
    nomaxvalue        --不设置最大值
    start with 1      --从1开始计数
    increment by 1    --每次加1个
    nocycle           --一直累加,不循环
    nocache;          --不建缓冲区

     最后我们只需要再把触发器设置好就行了:

    create or replace trigger tg_dept
      before insert on tbl_dept   --tbl_dept:表名
      for each row
    declare
      nextid number;
    begin
      IF :new.dept_id IS NULL or :new.dept_id=0 THEN --dept_id:列名
        select sql_dept.nextval --sql_dept:序列
        into nextid
        from sys.dual;
        :new.dept_id:=nextid;
      end if;
    end tg_dept;

    插入前:

      

    我们现在通过插入语句来测试一下吧,我们插入的语句中主键dept_id为空:

    insert into tbl_dept(dept_name) values('人事部');

    结果:

     

       

  • 相关阅读:
    1.0-springboot的java配置方式
    关于springboot启动的问题.
    关于Springboot整合mybatis启动的问题
    关于IDEA无法引入包和类的情况
    关于SpringBoot bean无法注入的问题(与文件包位置有关)改变自动扫描的包
    PostgerSQL 解决锁表
    git 合并冲突后回滚到之前版本
    双重检查锁实现单例
    SpringBoot事务
    SQL性能优化
  • 原文地址:https://www.cnblogs.com/fankailei/p/10027091.html
Copyright © 2020-2023  润新知