序列的定义与使用

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 的区别

NEXTVALCURRVAL 是 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,可能会导致序列值的快速消耗,这时可以考虑设置合适的序列增量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

茶色岛^

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

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

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

打赏作者

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

抵扣说明:

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

余额充值