Oracle中的序列(Sequence)是一种数据库对象,用于生成数字序列,通常用于为主键列生成唯一、连续的数值。以下是一些使用序列的案例:
1. **为主键生成唯一值**:
在Oracle中,序列最常用的场景是为主键列生成唯一的递增数值。例如,创建一个名为`my_sequence`的序列,可以这样使用:
```sql
CREATE SEQUENCE my_sequence
START WITH 1
INCREMENT BY 1
CACHE 20;
```
2. **在插入操作中使用序列**:
当你向表中插入新行时,可以使用序列来自动填充主键列。例如:
```sql
INSERT INTO employees (employee_id, name, department)
VALUES (my_sequence.NEXTVAL, 'John Doe', 'Finance');
```
这样,每次插入操作都会从`my_sequence`获取下一个可用的ID。
3. **获取序列的当前值**:
有时你可能需要获取序列的当前值,而不仅仅是下一个值。可以使用`CURRVAL`函数:
```sql
SELECT my_sequence.CURRVAL FROM dual;
```
这将返回最近一次由`NEXTVAL`分配的值。
4. **修改序列**:
如果需要修改序列的参数,比如改变步长或最大值,可以使用`ALTER SEQUENCE`命令:
```sql
ALTER SEQUENCE my_sequence
INCREMENT BY 10;
```
这将改变序列的步长为10。
5. **使用序列的缓存选项**:
序列支持缓存选项,可以提高性能,但需要注意,如果数据库崩溃,缓存中的值可能会丢失:
```sql
CREATE SEQUENCE my_sequence
CACHE 20;
```
这表示序列会缓存20个连续的数值。
6. **序列的循环使用**:
当序列达到最大值时,可以使用`CYCLE`选项让它循环回到最小值:
```sql
CREATE SEQUENCE my_sequence
MAXVALUE 100
CYCLE;
```
当序列值达到100后,它将重置为1并继续生成。
7. **在表中使用序列**:
在Oracle 12c之前,不能直接在表定义中使用序列作为默认值。需要使用触发器来间接使用序列:
```sql
CREATE TRIGGER my_table_trigger
BEFORE INSERT ON my_table
FOR EACH ROW
BEGIN
SELECT my_sequence.NEXTVAL INTO :new.id FROM dual;
END;
```
这样,每当向`my_table`插入新行时,触发器会自动填充`id`列。
8. **使用序列生成非递增序列**:
序列不仅可以递增,也可以设置为递减,这在某些特定的业务场景中可能很有用:
```sql
CREATE SEQUENCE my_sequence
INCREMENT BY -1
START WITH -1;
```
这将创建一个从-1开始递减的序列。