### Oracle序列主键自增长知识点详解 在Oracle数据库中,序列是一种非常实用的对象,它可以用于生成一系列数值。这些数值可以被用作表中的主键,从而实现主键的自增长功能。下面将详细介绍如何利用Oracle序列来实现主键的自增长。 #### 一、创建序列 **基本语法** 我们需要创建一个序列。以下是一个基本的创建序列的语法结构: ```sql CREATE SEQUENCE 序列名 INCREMENT BY 增量值 START WITH 起始值 MAXVALUE 最大值 NOCYCLE; -- 表示序列到达最大值后不再循环 ``` 根据题目描述,我们创建一个最小值为1且没有最大值限制(`NOMAXVALUE`)的序列,并且该序列不会循环(`NOCYCLE`)。具体语句如下: ```sql CREATE SEQUENCE 序列名 INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE; ``` 这里的关键在于设置了`INCREMENT BY 1`来确保每次增加的值是递增1;`START WITH 1`表示序列从1开始;`NOMAXVALUE`意味着序列没有最大值限制,即可以一直递增下去;`NOCYCLE`则确保序列达到最大值后不会重新从最小值开始计数。 #### 二、使用序列 **1. 插入新记录** 在插入新记录时,我们可以使用序列的`.NEXTVAL`来获取下一个序列值作为主键值。例如: ```sql INSERT INTO 表名 (主键列, 列1, 列2) VALUES (序列名.NEXTVAL, 值1, 值2); ``` **2. 当前值** 如果我们想要获取序列的当前值,可以使用`.CURRVAL`。但需要注意的是,在使用`.NEXTVAL`之后才能使用`.CURRVAL`。例如: ```sql INSERT INTO 表名 (主键列, 列1, 列2) VALUES (序列名.CURRVAL, 值1, 值2); ``` 或者先获取下一个值,再插入数据: ```sql SELECT 序列名.NEXTVAL INTO 变量 FROM DUAL; INSERT INTO 表名 (主键列, 列1, 列2) VALUES (变量, 值1, 值2); ``` **3. 触发器** 为了进一步自动化这个过程,我们可以创建一个触发器,当插入或更新表时自动填充主键列。下面是一个例子: ```sql CREATE OR REPLACE TRIGGER 触发器名 BEFORE INSERT OR UPDATE ON 表名 FOR EACH ROW BEGIN SELECT 序列名.NEXTVAL INTO :NEW.主键列 FROM DUAL; END; / ``` 这样,每当有新的记录插入或更新时,触发器都会自动为指定的主键列赋值下一个序列值。 #### 三、示例代码 接下来,我们将通过一个具体的示例来展示如何创建序列以及使用它来自动生成主键值。 **创建序列** ```sql CREATE SEQUENCE a_sequence START WITH 1 INCREMENT BY 1; ``` **创建表** ```sql CREATE TABLE t ( n NUMBER, v VARCHAR2(10) ); ``` **创建触发器** ```sql CREATE OR REPLACE TRIGGER t_trg BEFORE INSERT OR UPDATE ON t FOR EACH ROW BEGIN SELECT a_sequence.NEXTVAL INTO :NEW.n FROM DUAL; END; / ``` **插入记录** ```sql INSERT INTO t VALUES (NULL, 'ok'); ``` **查询结果** ```sql SELECT * FROM t; ``` 此时,表`t`中的`n`列应该已经被自动填充了一个主键值。 通过以上步骤,我们不仅创建了一个序列,还成功地实现了表中主键列的自增长。这种方式极大地简化了主键的管理,并且提高了数据处理的效率与安全性。
建立一个最小为1,最大为nomaxvalue的一个序列号会自动循环的序列
create sequence 序列名
increment by 1
start with 1
nomaxvalue
nocycle;
当向表中插入数据时,SQL语句写法如下:
SQL> insert into 表名 values(序列名.nextval,列1值,列2值, ...);
当要重用该序列号时,有两种方法:
a. 在同一个sql块中重用:
SQL>insert into表名(序列名.currval, 列1值,列2值...);
b. 在存储进程中,将该值取到一个参数中:
SQL>select序列名.nextval into 参数名 from dual;
然后在重用该序列号的地方调用这个参数。
实现方法2:(利用触发器)
SQL> create sequence a_sequence
2 start with 1
3 increment by 1;
序列已创建。
SQL> create table t (n number ,v varchar2(10));
表已创建。
SQL> create or replace trigger t_trg
2 before insert or update on t
3 for each row
4 begin
5 select a_sequence.nextval into :new.n from dual;
6 end;
7 /
触发器已创建
- 粉丝: 0
- 资源: 7
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助