CREATE SEQUENCE - 创建一个新的序列发生器

SYNOPSIS

CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]

DESCRIPTION 描述

CREATE SEQUENCE 将向当前数据库里增加一个新的序列号生成器。 包括创建和初始化一个新的名为 name的单行表。生成器将为使用此命令的用户所有。

如果给出了一个模式名,那么该序列是在指定模式中创建的。 否则它会在当前模式中创建临时序列存在于一个特殊的模式中,因此如果创建一个临时序列的时候, 不能给出模式名。 序列名必需和同一模式中的其他序列,表,索引,或者视图不同。

在序列创建后,你可以使用函数 nextval, currval, 和 setval
操作序列。这些函数在 ``Sequence-Manipulation Functions‘‘ 中有详细文档。

尽管你不能直接更新一个序列,但你可以使用象

SELECT * FROM name;

检查一个序列的参数和当前状态。特别是序列的 last_value 字段显示了任意后端进程分配的最后的数值。 (当然,这些值在被打印出来的时候可能已经过时了 --- 如果其它进程正积极地使用 nextval。)

PARAMETERS 参数

TEMPORARY or TEMP
 如果声明了这个修饰词,那么该序列对象只为这个会话创建, 并且在会话结束的时候自动删除。在临时序列存在的时候, 同名永久序列是不可见的(在同一会话里),除非它们是用模式修饰的名字引用的。

name
 将要创建的序列号名(可以用模式修饰)。
increment
INCREMENT BY increment 子句是可选的。一个正数将生成一个递增的序列,
一个负数将生成一个递减的序列。缺省值是一(1)。
minvalue
NO MINVALUE
 可选的子句 MINVALUE minvalue  决定一个序列可生成的最小值。 如果没有声明这个子句或者声明了 NO MINVALUE,那么就使用缺省。 缺省分别是递增序列为 1 递减为 -263-1。

maxvalue
NO MAXVALUE
 使用可选子句 MAXVALUE maxvalue  决定序列的最大值。 如果没有声明这个子句或者声明了 NO MAXVALUE,那么就使用缺省。 缺省的分别是递增为 263-1,递减为 -1。

start
 可选的 START WITH start  子句  使序列可以从任意位置开始。缺省初始值是递增序列为 minvalue  递减序列为 maxvalue.

cache
CACHE cache 选项使序列号预分配并且为快速访问存储在内存里面。 最小值(也是缺省值)是1(一次只能生成一个值, 也就是说没有缓存)这也是缺省。

CYCLE
NO CYCLE
 可选的CYCLE关键字可用于使序列到达 最大值(maxvalue) 或 最小值(minvalue)  时可复位并继续下去。如果达到极限,生成的下一个数据将分别是 最小值(minvalue) 或 最大值(maxvalue)。

如果声明了可选的关键字 NO CYCLE, 那么在序列达到其最大值之后任何对 nextval 的调用都强返回一个错误。 如果既没有声明 CYCLE 也没有声明 NO CYCLE, 那么 NO CYCLE 是缺省。

NOTES 注意

使用 DROP SEQUENCE 语句来删除序列。

序列是基于 bigint 运算的,因此其范围不能超过八字节的整数范围(-9223372036854775808 到 9223372036854775807)。 在一些老一点的平台上可能没有对八字节整数的编译器支持, 这种情况下序列使用普通的 integer 运算(范围是 -2147483648 到 +2147483647)。

如果 cache 设置大于一, 并且这个序列对象将被用于并发多会话的场合,那么可能会有不可预料的结果发生。 每个会话在一次访问序列对象的过程中将分配并缓存随后的序列值,并且相应增加序列对象的 last_value。 这样,同一个事务中的随后的 cache-1 次 nextval  将只是返回预先分配的数值,而不用动序列对象。因此,任何在一个会话中分配但是没有使用的数字都将在会话结尾丢失,导致序列里面出现"空洞"。

另外,尽管系统保证为多个会话分配独立的序列值,但是如果考虑所有会话, 那么这个数值可能会丢失顺序。比如,如果 cache  设置为 10,那么会话 A 保留了 1..10 并且返回 nextval=1, 然后会话 B 可能会保留 11..20 然后在会话 A 生成 nextval=2 之前返回 nextval=11。因此,对于 cache 设置为一的情况,我们可以安全地假设 nextval 值是顺序生成的; 而如果把 cache 设置得大于一, 那么你只能假设 nextval 值总是唯一得,而不是完全顺序地生成。 同样,last_value 将反映任何会话保留的最后的数值,不管它是否曾被 nextval 返回。

另外一个考虑是在这样的序列上执行的 setval 将不会被其它会话注意到,直到它们用光他们缓存的数值。

EXAMPLES 例子

创建一个叫 serial 的递增序列,从101开始:

CREATE SEQUENCE serial START 101;

从此序列中选出下一个数字:

SELECT nextval(‘serial‘);

 nextval
---------
     114

在一个 INSERT 中使用此序列:

INSERT INTO distributors VALUES (nextval(‘serial‘), ‘nothing‘);

在一个 COPY FROM 后更新序列:

BEGIN;
COPY distributors FROM ‘input_file‘;
SELECT setval(‘serial‘, max(id)) FROM distributors;
END;

原文地址:https://www.cnblogs.com/fanweisheng/p/11077652.html

时间: 2024-08-07 15:28:45

CREATE SEQUENCE - 创建一个新的序列发生器的相关文章

CREATE USER - 创建一个新的数据库用户帐户

SYNOPSIS CREATE USER name [ [ WITH ] option [ ... ] ] where option can be: SYSID uid | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password' | CREATEDB | NOCREATEDB | CREATEUSER | NOCREATEUSER | IN GROUP groupname [, ...] | VALID UNTIL 'abstime' DESCRIPTIO

SqlSever基础 create database 创建一个新的数据库到默认的位置

1 2 1 create database helloworld 3 4

CREATE DOMAIN - 定义一个新域

SYNOPSIS CREATE DOMAIN name [AS] data_type [ DEFAULT expression ] [ constraint [ ... ] ] where constraint is: [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK (expression) } DESCRIPTION 描述 CREATE DOMAIN 创建一个新的数据域. 定义域的用户成为其所有者. 如果给出一个模式名称(比如,

lab6:分析Linux内核创建一个新进程的过程

李俊锋 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验原理 1.进程的定义 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放.可以认为进程是一个程序的一次执行过程. 2.进程与程序的区别 程序时静态的,它是一些保存 在磁盘上得指令的有序集合,没有任何执行的概念. 进程是一个动态的概念,它是程序执行的过程

Windows下C/C++创建一个新进程

本文翻译自:XQQ524148626的专栏,http://blog.csdn.net/xqq524148626/article/details/4960513 本文地址:http://blog.csdn.net/qingdujun/article/details/41808261 VC++6.0运行通过,示例: #include <iostream> #include <windows.h> using namespace std; int main() { STARTUPINFO

3.通过现有的PDB创建一个新的PDB

实验说明:创建PDB除了可以通过种子PDB创建外,现在测试通过一个现有的用户PDB克隆创建新的PDB数据库 实验步骤: 1.创建测试数据 SQL> alter session set container=emp; Session altered. SQL> conn dsg/[email protected] Connected. SQL> create table test (id number(8)); Table created. SQL> begin   2  for i

mysql5.7基础 创建一个新的数据库

镇场文:       学儒家经世致用,行佛家普度众生,修道家全生保真,悟易理象数通变.以科技光耀善法,成就一良心博客.______________________________________________________________________________________________________ Operating System:UbuntuKylin 16.04 LTS 64bitmysql: Ver 14.14 Distrib 5.7.17, for Linux (

通过原型继承创建一个新对象

// 通过原型继承创建一个新对象 function inherit(p){ if (p == null) throw TypeError();//p是一个对象,但不能是null if(Object.create) //如果object.create()存在 return Object.create(p); //直接使用它 var t = typeof p;//否则进行进一步检测 if (t !== "object" && t !== 'function') throw

C# Tuple 创建一个新二元集合

List<string> list1=new List<string>(); List<string> list2=new List<string>(); //Tuple<List<string>, List<string>> tuple = new Tuple<List<string>, List<string>>(); //报错,不能这样初始化. Tuple<List<s