Oracle主键设置自增

Oracle数据库,将表的ID设置为自增

注:数据库:Oracle 12 R2

我知道的有两种方式:

  • 创建自增序列,给字段设置默认值,默认值就是自增序列;
  • 创建触发器,将自增序列和字段关联起来;

一、设置默认值

1. 建表时设置默认值
-- 创建自增序列
CREATE SEQUENCE "APPUSER"."STUDENT_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL;
-- 建表语句
CREATE TABLE "APPUSER"."STUDENT" 
(  "ID" NUMBER(10,0) DEFAULT "APPUSER"."STUDENT_SEQ".nextval, 
 "STDUEN_NUMBER" VARCHAR2(10 BYTE) NOT NULL ENABLE, 
 "STDUEN_NAME" VARCHAR2(30 BYTE) NOT NULL ENABLE, 
 "STUDENT_AGE" NUMBER(2,0),
 "STUDENT_GRADE" NUMBER(2,0), 
 "CREATED_BY" VARCHAR2(255 BYTE), 
 "CREATED_ON" TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP 
 PRIMARY KEY ("ID")
 USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
 TABLESPACE "USERS"  ENABLE) SEGMENT CREATION IMMEDIATE 
 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
 TABLESPACE "USERS" ;

上面这种建表时就设置好,是最简单的,当然有一点要注意:

-- 创建自增序列,再设置
CREATE SEQUENCE "APPUSER"."STUDENT_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL;
"ID" NUMBER(10,0) DEFAULT "APPUSER"."STUDENT_SEQ".nextval, 
-- 系统生成自增序列
"ID" NUMBER(10,0) GENERATED ALWAYS AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE , 

上面两种效果都是一样的,但是权限不一样,删除系统生成的自增序列,会提示权限不足;

2.建表后,给ID设置默认值为自增序列的值

对于已经存在的表,需要对ID设置成自增,需要考虑的是当前ID最大值是多少,然后再去创建自增序列;
若最大ID为100,则:

-- 创建自增序列,从101开始
CREATE SEQUENCE "APPUSER"."STUDENT_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 101 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL;

我是通过工具1,设置的默认值,就是在红框处填写:

"APPUSER"."STUDENT_SEQ".nextval

在这里插入图片描述

二、创建触发器

这种也是针对已经存在的表,某个字段(如ID)需要设置成自增:

create or replace trigger STUDENT_TRIGGER
before insert on STUDENT
for each row
begin
select STUDENT_SEQ.nextval into :new.id from dual;
end STUDENT_TRIGGER;
  • STUDENT_TRIGGER: 自定义的触发器name
  • STUDENT 自然是TABLE name
  • STUDENT_SEQ 是创建的自增序列name
    在这里插入图片描述
    大家也可以借助工具添加触发器1

以上sql语句,我都亲测,并测试执行过了,都是ok的。


  1. Navicat Premium 15 ↩︎ ↩︎

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风梧1994

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值