创建Sequences

本文介绍如何在数据库中创建一个从1开始递增的Sequence,并创建一个函数调用此Sequence,通过传递一个固定值来获取序列号,具体实现包括创建Sequence的SQL语句及函数的PL/pgSQL代码。

1.创建Sequence,从1开始递增

CREATE SEQUENCE info_id_seq INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START
WITH 1 NO CYCLE;

2.创建函数,调用Sequenect,传递一个固定值进去,默认以17400000000000000+seq

CREATE OR REPLACE FUNCTION "test"."fn_info_getsequence" (num1 numeric)  RETURNS SETOF numeric
  VOLATILE
AS $body$
declare
 rlt_seq numeric;
begin

   if num1=174 then
    return query select  num1*10000000000000+00000000000000+nextval('info_id_seq');
else
    raise exception 'param "num1" is incorrect,please input 174';
end if;
return;

end;
$body$ LANGUAGE plpgsql

 3.查看

select nextval('info_id_seq')

select fn_info_getsequence(174)

 

<think>我们被要求解释Oracle中序列(sequences)的创建方法及其工作原理。根据引用内容,序列是Oracle中用于生成唯一有序数字的对象,常用于生成主键值。 创建序列的基本语法: CREATE SEQUENCE sequence_name [INCREMENT BY n] -- 每次递增的值,默认为1 [START WITH n] -- 起始值,默认为1 [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] [CYCLE | NOCYCLE] -- 是否循环 [CACHE n | NOCACHE]; -- 是否缓存 引用[1]和[2]提供了创建序列的示例: CREATE SEQUENCE test_sequence INCREMENT BY 1 -- 每次加1 START WITH 1 -- 从1开始 NOMAXVALUE -- 不设置最大值 NOCYCLE -- 不循环 CACHE 10; -- 缓存10个值 但引用[1]和[3]也提到,使用缓存(CACHE)可能会导致跳号(当数据库异常关闭时,缓存中的序列值会丢失),因此有时推荐使用NOCACHE。 序列的作用(引用[2]): 1. 自动生成唯一值 2. 可以被多个用户共享 3. 常用于生成主键值 4. 可以替代应用程序中的自增逻辑 5. 当使用缓存时可以提高访问效率 序列的工作原理(引用[4]): 1. 使用NEXTVAL获取下一个值,第一次使用NEXTVAL会初始化序列并返回起始值,后续每次调用NEXTVAL都会增加序列值(增加量为INCREMENT BY)。 2. 使用CURRVAL可以获取当前序列值,但必须在当前会话中先调用过NEXTVAL。 注意事项: - 序列值的生成是独立于事务的,即使事务回滚,序列值也不会回退(因为序列值被多个会话共享,回退会导致重复或管理复杂)。 - 在同一个SQL语句中多次使用NEXTVAL,每次都会得到不同的值(递增)。 因此,我们可以这样组织回答: 1. 创建序列的方法(语法和选项说明) 2. 序列的作用 3. 序列的工作原理(NEXTVAL和CURRVAL的使用) 4. 注意事项(缓存、跳号、事务无关性等) 同时,根据引用内容,我们还需要在回答中标注引用(在引用内容的末尾加上[^1]等)。 另外,用户要求使用中文回答,并且按照格式要求处理数学表达式(但本问题中数学表达式较少,主要是SQL语句和说明)。 最后,生成相关问题。</think>### Oracle序列(Sequences)详解 #### 一、序列的创建方法 Oracle序列通过`CREATE SEQUENCE`命令创建,完整语法如下: ```sql CREATE SEQUENCE sequence_name [INCREMENT BY n] -- 每次递增的值,默认1 [START WITH n] -- 起始值,默认1 [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] [CYCLE | NOCYCLE] -- 是否循环 [CACHE n | NOCACHE]; -- 是否缓存 ``` **标准创建示例**: ```sql CREATE SEQUENCE order_seq INCREMENT BY 1 -- 每次增加1 START WITH 1000 -- 起始值1000 MAXVALUE 999999 -- 最大值限制 NOCYCLE -- 达到最大值后停止 NOCACHE; -- 禁用缓存 ``` #### 二、序列的核心作用 1. **唯一主键生成器** 自动生成数据库表的主键值,确保唯一性 ```sql INSERT INTO orders(id, product) VALUES (order_seq.NEXTVAL, 'Laptop'); ``` 2. **跨会话共享对象** 多个会话可同时访问同一序列,Oracle保证值不冲突 3. **性能优化工具** 缓存机制减少磁盘I/O(但需权衡数据连续性) 4. **替代应用层ID生成** 避免在应用层实现复杂的ID生成逻辑[^2] #### 三、序列工作原理 ##### 1. 值生成机制 ```mermaid graph TD A[调用NEXTVAL] --> B{首次调用?} B -->|是| C[返回START WITH值] B -->|否| D[当前值 + INCREMENT BY] C --> E[更新数据字典] D --> E E --> F[返回新值] ``` - **`NEXTVAL`**:获取下一个序列值(递增操作) - **`CURRVAL`**:获取当前序列值(需在同一会话中先调用`NEXTVAL`)[^4] - 值计算公式:$V_{new} = V_{current} + \Delta$ ##### 2. 事务特性 - **独立于事务**:序列值递增不受事务回滚影响 ```sql BEGIN SELECT order_seq.NEXTVAL FROM dual; -- 返回1000 ROLLBACK; -- 事务回滚 SELECT order_seq.NEXTVAL FROM dual; -- 仍返回1001 END; ``` - **原子性保证**:多会话并发时通过内部锁机制避免值冲突 ##### 3. 缓存机制原理 - **启用缓存**(`CACHE 20`): - Oracle预分配20个值到内存 - 内存值用完后自动刷新 - **风险**:数据库异常关闭时缓存丢失导致跳号[^1][^3] - **解决方案**:关键业务使用`NOCACHE`保证连续性 #### 四、序列使用示例 ```sql -- 创建序列 CREATE SEQUENCE user_id_seq START WITH 100 INCREMENT BY 2; -- 获取值 SELECT user_id_seq.NEXTVAL FROM dual; -- 返回100 SELECT user_id_seq.CURRVAL FROM dual; -- 返回100(当前值) -- 插入数据 INSERT INTO users(id, name) VALUES (user_id_seq.NEXTVAL, 'Alice'); -- ID=102 ``` #### 五、最佳实践建议 1. **主键生成**:优先使用`NOCACHE`保证连续性 2. **高并发场景**:使用`CACHE 100`提升性能(接受少量间隔) 3. **循环序列**:`CYCLE`模式慎用,可能导致主键重复 4. **监控**:定期检查`USER_SEQUENCES`视图 ```sql SELECT * FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'ORDER_SEQ'; ``` > **关键注意事项**:序列设计需平衡性能与业务需求,金融交易等敏感场景推荐`NOCACHE`,日志类高吞吐场景可用大缓存提升性能[^1][^3]。 --- ### 相关问题 1. 序列值达到最大值后会发生什么?如何重置序列? 2. 在事务回滚时,为什么序列的`NEXTVAL`不会回退? 3. 使用`CACHE`和`NOCACHE`选项对数据库性能有何影响? 4. 如何查看Oracle数据库中所有已存在的序列? 5. 序列作为主键与UUID作为主键在分布式系统中有何优劣?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值