
# CREATE SEQUENCE
#### 功能描述
向当前数据库里增加一个新的序列。
序列是一个数据库对象，主要用于生成一系列唯一的、递增或递减的数值，通常用作表中的主键或唯一标识符。
#### 注意事项
- 创建序列的用户为该序列的所有者。
- 如果指定了模式名称，则会在指定模式中创建序列，否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名字不同。
- 创建序列后，在表中使用序列的nextval()函数和generate_series(1,N)函数对表插入数据，请保证nextval的可调用次数大于等于N+1次，否则会因为generate_series()函数会调用N+1次而导致报错。
- 不支持在template1数据库中创建SEQUENCE。
- 建议控制SEQUENCE的使用数量（含SERIAL类型），因分布式场景下SEQUENCE中序列值的产生依赖GTM全局管理，频繁的与GTM交互会严重影响性能。建议引用公共的SEQUENCE对象，或者针对需要唯一值的场景使用UUID进行替换。同时为尽量减少与GTM的交互，针对手动创建的SEQUENCE，建议指定CACHE值不小于10000。
 
#### 语法格式
```
CREATE 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 } ];
```
#### 参数说明
表1CREATE SEQUENCE参数说明 
| 参数                                            | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 取值范围                                                                                                                                                                                                                                                                                                                                                                                                                                                |
|:---|:---|:---|
| IF NOT EXISTS                                 | 指定IF NOT EXISTS时，若不存在同名SEQUENCE，则可以成功创建SEQUENCE。若已存在同名SEQUENCE，创建时不会报错，仅会提示该SEQUENCE已存在，且不执行任何操作。 该参数仅9.1.0及以上版本支持。                                                                                                                                                                                                                                                                                                                                                                                                                   | -                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| name                                          | 将要创建的序列名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | 字符串，需符合[标识符命名规范](https://support.huaweicloud.com/sqlreference-dws/dws_06_0007.html#ZH-CN_TOPIC_0000001811634529__section1475018612353)。                                                                                                                                                                                                                                                                                                             |
| increment                                     | 指定序列的步长。正值将生成一个递增的序列，负值将生成一个递减的序列。 默认值为1。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | -                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| MINVALUE minvalue \| NO MINVALUE\| NOMINVALUE | 确定序列可以生成的最小值。如果没有指定minvalue或者指定了NO MINVALUE，则递增序列的缺省值为1，递减序列的缺省值为-2^63^-1。 NOMINVALUE等价于NO MINVALUE。                                                                                                                                                                                                                                                                                                                                                                                                              | -                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| MAXVALUE maxvalue \| NO MAXVALUE\| NOMAXVALUE | 确定序列可以生成的最大值。如果没有声明maxvalue或者声明了NO MAXVALUE，则递增序列的缺省值为2^63^-1，递减序列的缺省值为-1。 NOMAXVALUE等价于NO MAXVALUE。                                                                                                                                                                                                                                                                                                                                                                                                              | -                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| start                                         | 指定序列的起始值。 默认值：对于递增序列为minvalue，递减序列为maxvalue。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | -                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| cache                                         | 指定数据库预先缓存（预分配）多少个序列号到内存中，从而加快访问速度。一个缓存周期内，CN不再向GTM索取序列号，而是使用本地预先申请的序列号。 9.1.0.100及以上集群版本中缺省值由GUC参数default_sequence_cache控制。 - 新安装的9.1.0.100及以上集群版本中，默认值为20。  - 从低版本升级到9.1.0.100及以上集群版本，默认值为1。表示一次只能生成一个值，即没有缓存。   | - 不建议同时定义cache和maxvalue或minvalue。因为定义cache后不能保证序列的连续性，可能会产生空洞，造成序列号段浪费。  - 建议cache值不要设置过大，否则会出现缓存序列号时（每个cache周期的第一个nextval）耗时过长的情况；同时建议cache值小于100000000。实际使用时应根据业务设置合理的cache值，既能保证快速访问，又不会浪费序列号。   |
| CYCLE \| NOCYCLE                              | 当序列达到maxvalue或者minvalue时，允许序列可循环重新开始。 默认值为NO CYCLE，表示序列达到极大或极小值后将无法生成新值。NOCYCLE的作用等价于NO CYCLE。 - 如果指定序列为CYCLE，则不能保证序列的唯一性。  - 如果指定了NO CYCLE，则在序列达到其最大值后任何对nextval的调用都将返回错误。                    | -                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| OWNED BY                                      | 将序列与特定表的指定字段相关联。这样，如果该字段或其所在表被删除，该序列也将被自动删除。关联的表和序列的所有者必须是同一个用户，并且在同一个模式中。 缺省值为OWNED BY NONE，表示不存在这种关联。                                                                                                                                                                                                                                                                                                                                                                                                                               | - 通过指定OWNED BY，仅建立了表的对应列和SEQUENCE之间关联关系，并不会在插入数据时在该列上产生自增序列。  - 通过指定OWNED BY创建的SEQUENCE不建议用于其他表，如果希望多个表共享SEQUENCE，该SEQUENCE不应该从属于特定表。                                                               |
   
#### 示例
创建一个名为serial的递增序列，从101开始。
```
DROP SEQUENCE IF EXISTS  serial;
CREATE SEQUENCE serial
 START 101
 CACHE 20;
```
从序列中选出下一个数字。
```
SELECT nextval('serial');
```
![](https://support.huaweicloud.com/sqlreference-dws/figure/zh-cn_image_0000002567948268.png "点击放大")
从序列中选出下一个数字。
```
SELECT nextval('serial');
```
![](https://support.huaweicloud.com/sqlreference-dws/figure/zh-cn_image_0000002598547875.png "点击放大")
创建与表关联的序列。
```
DROP TABLE IF EXISTS customer_address;
CREATE TABLE customer_address
(
    ca_address_sk             integer               not null,
    ca_address_id             char(16)              not null,
    ca_street_number          char(10)                      ,
    ca_street_name            varchar(60)                   ,
    ca_street_type            char(15)                      ,
    ca_suite_number           char(10)                      ,
    ca_city                   varchar(60)                   ,
    ca_county                 varchar(30)                   ,
    ca_state                  char(2)                       ,
    ca_zip                    char(10)                      ,
    ca_country                varchar(20)                   ,
    ca_gmt_offset             decimal(5,2)                  ,
    ca_location_type          char(20)                     
) ;
DROP SEQUENCE IF EXISTS serial1;
CREATE SEQUENCE serial1
 START 101
 CACHE 20
OWNED BY customer_address.ca_address_sk;
```
使用serial创建主键自增序列表serial_table。
```
DROP TABLE IF EXISTS serial_table;
CREATE TABLE serial_table(a int, b serial);
INSERT INTO serial_table (a) VALUES (1),(2),(3);
SELECT * FROM serial_table ORDER BY b;
```
![](https://support.huaweicloud.com/sqlreference-dws/figure/zh-cn_image_0000002598388275.png "点击放大")
#### 相关链接
[ALTER SEQUENCE](https://support.huaweicloud.com/sqlreference-dws/dws_06_0137.html)，[DROP SEQUENCE](https://support.huaweicloud.com/sqlreference-dws/dws_06_0205.html)
