
# CREATE SEQUENCE
#### 功能描述
CREATE SEQUENCE用于向当前数据库增加一个新的序列。序列的Owner为创建此序列的用户。
#### 注意事项
- SEQUENCE是一个存放等差数列的特殊表。这个表没有实际意义，通常用于为行或者表生成唯一的标识符。
- 如果给出一个模式名，则该序列就在给定的模式中创建，否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名称不同。
- 创建序列后，在表中使用序列的nextval()函数和generate_series(1,N)函数对表插入数据，请保证nextval的可调用次数大于等于N+1次，否则会因为generate_series()函数会调用N+1次而导致报错。
- SEQUENCE默认最大值为2\^63-1，如果使用了LARGE标识则最大值可以支持到2\^127-1。
- 被授予CREATE ANY SEQUENCE权限的用户，可以在public模式和用户模式下创建序列。
 
#### 语法格式
```
CREATE [ LARGE | TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] name [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE | NOMINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE] 
    [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE | NOCYCLE ] 
    [ OWNED BY { table_name.column_name | NONE } ];
```
![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/figure/zh-cn_image_0000002526899554.png "点击放大")
#### 参数说明
- **LARGE**
  可选。允许序列存储为大整数（int128）类型关键字。
  

- **TEMPORARY \| TEMP**
  可选。临时序列关键字。
  ![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - 创建临时序列需要数据库启用PG兼容。
  
  - 临时序列的生命周期是会话级的，临时序列对象是会话隔离的。序列在会话退出后会自动删除清理。
  
  - 临时序列存在于一个特殊的模式中，每个会话有且仅有一个临时模式，若提前创建了临时模式，则在创建临时序列时可给出模式名，若未提前创建，则在创建临时序列时不能给出模式名，并且每个会话只能访问自己的临时模式中的对象，无法访问其他会话的临时模式中的对象。如果访问的临时模式不属于本会话，会报告错误。
  
  - 当临时序列存在时，已有的同名永久序列（在这个会话中） 会变得不可见，不过可以用模式限定的名称来引用同名永久序列。
    
- **IF NOT EXISTS**
  如果指定IF NOT EXISTS关键字，创建序列前会在当前SCHEMA中查找是否已有名字相同的relation。若已有同名relation存在，则不会新建，返回NOTICE提示。未指定IF NOT EXISTS关键字时，若SCHEMA中存在同名relation，返回ERROR告警。
  
- **name**
  将要创建的序列名称。
  取值范围: 仅可以使用小写字母（a\~z）、 大写字母（A\~Z）、数字和特殊字符"#" 、"_"、"$"的组合。
  
- **increment**
  可选。指定序列的步长。一个正数将生成一个递增的序列，一个负数将生成一个递减的序列。
  缺省值为1。
  ![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  在B兼容模式下，步长为浮点数时会自动转为整型。其他模式下，该参数不支持输入浮点数。
  
- **MINVALUE minvalue \| NO MINVALUE\| NOMINVALUE**
  可选。执行序列的最小值。NOMINVALUE等价于NO MINVALUE。
  如果没有声明minvalue或者声明了NO MINVALUE时：
  - 对于未声明LARGE关键字的序列，递增序列的缺省值为1，递减序列的缺省值为-2^63^-1。
  
  - 对于声明了LARGE关键字的序列，递增序列的缺省值为1，递减序列的缺省值为-2^127^-1。
   
- **MAXVALUE maxvalue \| NO MAXVALUE\| NOMAXVALUE**
  可选。执行序列的最大值。NOMAXVALUE等价于NO MAXVALUE。
  如果没有声明maxvalue或者声明了NO MAXVALUE时：
  - 对于未声明LARGE关键字的序列，递增序列的缺省值为2^63^-1，递减序列的缺省值为-1。
  
  - 对于声明了LARGE关键字的序列，递增序列的缺省值为2^127^-1，递减序列的缺省值为-1。
   
- **start**
  可选。指定序列的起始值。缺省值：对于递增序列为minvalue，递减序列为maxvalue。
  
- **cache**
  可选。为了快速访问，而在内存中预先存储序列号的个数。
  缺省值为1，表示一次只能生成一个值，也就是没有缓存。
  ![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  不建议同时定义cache和maxvalue或minvalue。因为定义cache后不能保证序列的连续性，可能会产生空洞，造成序列号段浪费。
  
- **\[ NO \] CYCLE \| NOCYCLE**
  可选。用于使序列达到maxvalue或者minvalue后可循环并继续下去。
  如果声明了NO CYCLE，则在序列达到其最大值后任何对nextval的调用都会返回一个错误。
  - NOCYCLE的作用等价于NO CYCLE。缺省值为NO CYCLE。
  
  - 若定义序列为CYCLE，则不能保证序列的唯一性。
   
- **OWNED BY**
  可选。将序列和一个表的指定字段进行关联。这样，在删除该字段或其所在表的时候会自动删除已关联的序列。关联的表和序列的所有者必须是同一个用户，并且在同一个模式中。需要注意的是，通过指定OWNED BY，仅仅是建立了表的对应列和SEQUENCE之间关联关系，并不会在插入数据时在该列上产生自增序列。
  缺省值为OWNED BY NONE，表示不存在这样的关联。
  ![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
  通过OWNED BY创建的SEQUENCE不建议用于其他表，如果希望多个表共享SEQUENCE，该SEQUENCE不应该从属于特定表。
  
 
#### 示例
- 创建一个名为seq1的递增序列，从101开始，步长为10。
  ```
  gaussdb=# CREATE SEQUENCE seq1
      START 101
      INCREMENT 10;
  --从序列中选出下一个数字：
  gaussdb=# SELECT nextval('seq1');
   nextval 
  ---------
       101
  (1 row)
  gaussdb=# SELECT nextval('seq1');
   nextval 
  ---------
       111
  --删除序列。
  gaussdb=# DROP SEQUENCE seq1;
  ```
  
- 表自增列的一种实现。
  ```
  --创建表。
  gaussdb=# CREATE TABLE test1(id int PRIMARY KEY, name varchar(20));
  --创建与表关联的序列。
  gaussdb=# CREATE SEQUENCE test_seq2
      START 1
      NO CYCLE
      OWNED BY test1.id;
  --设置字段的默认值。
  gaussdb=# ALTER TABLE test1 ALTER COLUMN id SET DEFAULT nextval('test_seq2'::regclass);
  -- 插入数据。
  gaussdb=# INSERT INTO test1 (name) values ('Joe'),('Scott'),('Ben');
  --查询表的数据。
  gaussdb=# SELECT * FROM test1;
   id | name  
  ----+-------
    1 | Joe
    2 | Scott
    3 | Ben
  (3 rows)
  --删除序列和表。
  gaussdb=# DROP SEQUENCE test_seq2 CASCADE;
  gaussdb=# DROP TABLE test1;
  ```
  
- 序列的循环。
  ```
  --创建一个递增序列seq_test1，最大值为3，且可以循环。
  gaussdb=# CREATE SEQUENCE seq_test1
      START 1 
      MAXVALUE 3 
      CYCLE;
  --建表，并插数据。
  gaussdb=# CREATE TABLE tbl_test1(
      c1 int DEFAULT nextval('seq_test1'),
      c2 varchar
  );
  gaussdb=# INSERT INTO tbl_test1 (c2) values ('test');
  gaussdb=# INSERT INTO tbl_test1 (c2) values ('test');
  gaussdb=# INSERT INTO tbl_test1 (c2) values ('test');
  gaussdb=# INSERT INTO tbl_test1 (c2) values ('test');
  gaussdb=# INSERT INTO tbl_test1 (c2) values ('test');
  --查询表数据，当递增序列seq_test的值达到最大值后会重新从最小值开始。
  gaussdb=# SELECT * FROM tbl_test1;
   c1 |  c2  
  ----+------
    1 | test
    2 | test
    3 | test
    1 | test
    2 | test
  (5 rows)
  --删除表和序列。
  gaussdb=# DROP TABLE tbl_test1;
  gaussdb=# DROP SEQUENCE seq_test1;
  ```
  
 
#### 相关链接
[DROP SEQUENCE](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0624.html#ZH-CN_TOPIC_0000002527828338)，[ALTER SEQUENCE](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0504.html#ZH-CN_TOPIC_0000002527828280)
