1. 创建表 student
首先创建一个表student,字段包括sid(4),sname(varchar2(8)),并且sid为主键。
建表语句参考如下:
CREATE TABLE student (
sid NUMBER(4) PRIMARY KEY,
sname VARCHAR2(8) NOT NULL
);
2. 创建序列 student_seq
创建序列student_seq,语句如下:
CREATE SEQUENCE student_seq
START WITH 1001 -- 起始值
INCREMENT BY 1 -- 每次递增的值
NOCACHE -- 不缓存序列值(可选)
NOCYCLE; -- 不循环(可选)
ORDER;
3. 向 student
表插入数据
对student表添加如下数据,然后查看一下结果,注意观察主键生成情况。
以下是添加正确和错误的信息,但nextval都会逐渐递增。
-- 正确插入
INSERT INTO student (sid, sname) VALUES (student_seq.NEXTVAL, 'Alice');
INSERT INTO student (sid, sname) VALUES (student_seq.NEXTVAL, 'Bob');-- 错误插入(sid 重复)
-- INSERT INTO student (sid, sname) VALUES (1, 'Charlie'); -- 这将导致主键冲突错误
4. 查询表中的数据
查询新添加的记录,观察序列的产生。
SELECT * FROM student;
5. NEXTVAL 和 CURRVAL 的区别
NEXTVAL
和 CURRVAL
是 Oracle 数据库中用于管理序列(Sequence)的两个关键关键字,它们之间有以下主要区别:
NEXTVAL
:
NEXTVAL
用于获取序列的下一个值。- 当你使用
NEXTVAL
时,它将返回序列的下一个值,然后将序列的当前值递增(增加 1)。NEXTVAL
是在 INSERT 语句中常用的,用于为表的列分配一个新的唯一值。- 使用
NEXTVAL
不需要先执行CURRVAL
,因为它会自动递增序列的当前值。
SELECT student_seq.NEXTVAL FROM dual; -- 获取下一个值
CURRVAL
:
CURRVAL
用于获取序列的当前值。- 当你使用
CURRVAL
时,它将返回序列的当前值,而不会对序列的当前值进行递增。CURRVAL
通常在 INSERT 语句之后使用,用于检索最近插入行中序列生成的值。- 使用
CURRVAL
之前必须先执行NEXTVAL
,以确保序列的当前值已经被生成。
SELECT student_seq.CURRVAL FROM dual; -- 获取当前值
6. 补充内容
-
序列缓存: 如果您使用
CACHE
选项,序列值会被预先分配并存储在内存中,从而提高性能。但在数据库重启时,这些缓存的值可能会丢失。 -
使用场景: 序列通常用于生成唯一标识符,如订单号、用户ID等,尤其在分布式系统中,能够保证各个节点的数据唯一性。
-
异常处理: 在插入数据时,如果尝试插入一个已经存在的
sid
值,将导致主键冲突错误。您可以使用异常处理机制(如 PL/SQL 块)来捕获并处理这些异常。 -
性能考虑: 在高并发环境中,如果多个会话同时请求
NEXTVAL
,可能会导致序列值的快速消耗,这时可以考虑设置合适的序列增量。