Oracle序列

序列是Oracle提供的用于生成一系列唯一数字的数据库对象。序列会自动生成顺序递增的序列号,以实现自动提供唯一的主键值。序列可以在多用户并发环境中使用,并且可以为所有用户生成不重复的顺序数字,而不需要任何额外的I/O开销。

1、创建序列

序列与视图一样,并不占用实际的存储空间,只是在数据字典中保存它的定义信息。用户在自己的模式中创建序列时,必须具有CREATE SEQUENCE系统权限;如果要在其他模式中创建序列,必须具有CREATE SEQUENCE系统权限。

使用CREATE SEQUENCE语句创建序列的语法如下:

create sequence <seq_name>
[start with n]
[increment by n]
[minvalue n | nomainvalue]
[maxvalue n | nomaxvalue]
[cache n | nocache]
[cycle | nocycle]
[order | noorder];

seq_name:创建序列名称。

increment:该子句是可选的,表示序列的增量。一个正数将生成一个递增的序列,一个负数将生成一个递减的序列。默认值是1。

minvalue:可选的子句,决定序列生成的最小值。

maxvalue:可选的子句,决定序列生成的最大值。

start:可选的子句,指定序列的开始位置。默认情况下,递增序列的起始值为minvalue,递减序列的起始值为maxvalue。

cache:可选的子句,决定是否产生序号预分配,并存储在内存中。

cycle:可选的子句,当序列达到最大值或最小值时,可以复位并继续下去。如果达到极限,生成的下一个数据将分别是最小值或最大值。如果使用nocycle,那么在序列达到其最大值后最小值之后,如果试图再获取下一个值将返回一个错误。

order:可选的子句,可以保证生成的序列值是按照顺序产生的。例如,order可以保证第一个请求得到的数为1,第二个请求到的数为2,以此类推;而noorder只保证序列值得唯一性,不保证产生序列值得顺序。

【实例】在SCOTT模式下,创建一个序列STU_SEQ。

CREATE SEQUENCE STU_SEQ
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999999999999

2、使用序列

创建STUDENT_INFO(学生信息)表,用于实例的操作使用。

--创建“学生信息”数据表
CREATE TABLE STUDENT_INFO
(
  STU_ID INT,
  STU_NAME VARCHAR2(8)          
);

【实例】使用序列STU_SEQ为STUDENT_INFO(学生信息)表的新记录提供学生编号。

INSERT INTO STUDENT_INFO(STU_ID,STU_NAME) VALUES(STU_SEQ.NEXTVAL,'张三');

【实例】使用伪列CURRVAL查询当前序列号。

SELECT STU_SEQ.CURRVAL FROM DUAL;

实际上,在为表生成主键值时,通常是为表创建一个行级触发器,然后在触发器主体中使用序列值替换用户提供的值。

【实例】创建一个行级触发器,该触发器在STUDENT_INFO(学生信息)表插入数据时被触发,并且在该触发器的主体中实现设置STUDENT_INFO(学生信息)表STU_ID列的值

CREATE OR REPLACE TRIGGER TRI_INSERT_STU  
  BEFORE INSERT  
  ON STUDENT_INFO  --关于STUDENT_INFO数据表的STU_ID,在插入STU_ID列之前,引起该触发器的运行  
  FOR EACH ROW     --创建行级触发器  
BEGIN  
  SELECT STU_SEQ.NEXTVAL  
  INTO :NEW.STU_ID  
  FROM DUAL;       --从序列中生成一个新的数值,赋值给当前插入行的STU_ID列  
END;  

--测试
INSERT INTO STUDENT_INFO(STU_NAME) VALUES('李四');

3、修改序列

使用ALTER SEQUENCE语句可以对序列进行修改。需要注意,除了序列的起始值START WITH不能被修改外,其它可以设置序列的任何子句和参数都可以被修改。如果要修改序列的起始值,则必须先删除序列,然后重键该序列。

【实例】修改STU_SEQ的最大值为100000,序号增量为200,缓存值为100。

ALTER SEQUENCE STU_SEQ
MAXVALUE 100000
INCREMENT BY 200
CACHE 100

4、删除序列

【实例】使用DROP SEQUENCE语句删除STU_SEQ序列。

DROP SEQUENCE STU_SEQ;

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要将 Oracle 序列迁移到 MySQL,需要考虑到两个数据库之间的差异。在 Oracle 中,序列是自动递增的整数值生成器,而 MySQL 中没有直接的序列类型。以下是一个迁移序列的一般步骤: 1. 创建一个 MySQL 表来模拟序列:在 MySQL 中,您可以创建一个包含一个自增列的表来模拟序列。例如,创建一个名为 `sequence_table` 的表,其中包含一个名为 `sequence_value` 的自增列。 2. 导出 Oracle 序列的当前值:使用 Oracle SQL 查询来获取序列的当前值。例如,对于名为 `my_sequence` 的序列,您可以运行如下查询:`SELECT my_sequence.CURRVAL FROM dual;`。 3. 将导出的当前值插入到模拟序列表中:将步骤 2 中导出的序列当前值插入到 MySQL 的模拟序列表中。 例如,使用以下查询将序列当前值插入到 `sequence_table` 表中: ```sql INSERT INTO sequence_table (sequence_value) VALUES (<当前值>); ``` 4. 创建一个在 MySQL 中自增的列:在需要使用序列的 MySQL 表中,创建一个自增列,以模拟 Oracle 序列的行为。例如,创建一个名为 `id` 的自增列。 5. 更新表的自增列的起始值:使用 `ALTER TABLE` 语句来更新自增列的起始值,以与步骤 2 中导出的当前值匹配。 例如,使用以下查询将 `id` 列的起始值更新为模拟序列表中的当前值: ```sql ALTER TABLE your_table AUTO_INCREMENT = <当前值>; ``` 现在,您可以使用 MySQL 表中的自增列来模拟 Oracle 序列的行为。请注意,这只是一种模拟方法,可能无法完全复制 Oracle 序列的所有行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

pan_junbiao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值