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的。
2092

被折叠的 条评论
为什么被折叠?



