Oracle之三步建表

200 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

Oracle建完表之后是没有主键自增的选项的 而这我们应该怎么处理呢 Oracle里有一个叫做序列器的东西 我们可以使用这个来进行主键自增

首先我们先建一个表并设好主键和数据库的一些属性

-- Create table
create table TABLE_NAME
(
  id              NUMBER not null
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 8K
    minextents 1
    maxextents unlimited
  );
-- Add comments to the columns 
comment on column TABLE_NAME.id
  is '序号';

-- Create/Recreate primary, unique and foreign key constraints 
alter table TABLE_NAME
  add constraint TABLE_NAME_ID primary key (ID)
  using index 
  tablespace USERS
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

然后我们再创建一个对主键进行自增的一个序列器 这段代码的意思是 创建一个名为TABLE_NAME_SEQ的序列器 最小值为1 最大值为9999999999999999999999999999 这样应该够用了 然后开始为1 每次自增加1 nocache的意思是不预先生成序列存入缓存 而cache 默认为20 可以通过而cache a(a为任意正整数) 设置预先缓存的序列值 具体的优劣 请感兴趣的读者自行查阅

-- Create sequence 
create sequence TABLE_NAME_SEQ
minvalue 1
maxvalue 9999999999999999999999999999
start with 1
increment by 1
nocache;

然后我们再建立一个主键自增的触发器 这一段代码的意思为 创建一个名为TABLE_NAME_TRG的触发器 使得在插入这个表的每一行时 当id为空是 从虚表中查找下一个插入的主键值 而这里比较重要的是虚拟表这个概念 这个Dual表主要用来选择系统变量或求一个表达式的值,而Oracle有内部逻辑保证dual表中永远只有一条数据,而有同学还有疑惑这个 NEXTVAL是啥东西,其实这个NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值, 然后返回增加后的值,就是返回序列器增加过一次的值 而除了NEXTVAL 还有一个叫做CURRVAL返回当前序列的值 .

CREATE OR REPLACE TRIGGER TABLE_NAME_TRG
BEFORE INSERT ON TABLE_NAME FOR EACH ROW
WHEN(NEW.ID Is NULL)
BEGIN
  SELECT TABLE_NAME_SEQ.NEXTVAL INTO :NEW.ID FROM DUAL;
  END;