GaussDB-CREATE SEQUENCE

101 阅读4分钟

GaussDB-CREATE SEQUENCE

功能描述

CREATE SEQUENCE用于向当前数据库增加一个新的序列。序列的Owner为创建此序列的用户。

注意事项
  • SEQUENCE是一个存放等差数列的特殊表。这个表没有实际意义,通常用于为行或者表生成唯一的标识符。
  • 如果给出一个模式名,则该序列就在给定的模式中创建,否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名称不同。
  • 创建序列后,在表中使用序列的nextval()函数和generate_series(1,N)函数对表插入数据,请保证nextval的可调用次数大于等于N+1次,否则会因为generate_series()函数会调用N+1次而导致报错。
  • 被授予CREATE ANY SEQUENCE权限的用户,可以在public模式和用户模式下创建序列。
语法格式

| ``` 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 } ];

| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/1426e24db97543a0b96b31ffa95ce780~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1772696545&x-signature=hPh8iPPQM6MfzUs30GolIrZFhBE%3D)

#### 参数说明

-   **IF NOT EXISTS**

    如果指定IF NOT EXISTS关键字,创建序列前会在当前SCHEMA中查找是否已有名字相同的relation。若已有同名relation存在,则不会新建,返回NOTICE提示。未指定IF NOT EXISTS关键字时,若SCHEMA中存在同名relation,返回ERROR告警。

-   **name**

    将要创建的序列名称。

    取值范围: 仅可以使用小写字母(a~z)、 大写字母(A~Z)、数字和特殊字符“#” 、“_”、“$”的组合。

-   **increment**

    可选。指定序列的步长。一个正数将生成一个递增的序列,一个负数将生成一个递减的序列。

    缺省值为1。

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/a8ff4b4382334a04a9ad36465cc31f64~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1772696545&x-signature=A95ug9yZze7KZCak4oOBAHeyrxQ%3D)

    在MYSQL兼容模式下,步长为浮点数时会自动转为整型。其他模式下,该参数不支持输入浮点数。

-   **MINVALUE minvalue | NO MINVALUE| NOMINVALUE**

    可选。执行序列的最小值。如果没有声明minvalue或者声明了NO MINVALUE,则递增序列的缺省值为1,递减序列的缺省值为-263-1。NOMINVALUE等价于NO MINVALUE。

-   **MAXVALUE maxvalue | NO MAXVALUE| NOMAXVALUE**

    可选。执行序列的最大值。如果没有声明maxvalue或者声明了NO MAXVALUE,则递增序列的缺省值为263-1,递减序列的缺省值为-1。NOMAXVALUE等价于NO MAXVALUE。

-   **start**

    可选。指定序列的起始值。缺省值:对于递增序列为minvalue,递减序列为maxvalue。

-   **cache**

    可选。为了快速访问,而在内存中预先存储序列号的个数。

    缺省值为1,表示一次只能生成一个值,也就是没有缓存。

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/b310a683add6429087dd32a8576af290~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1772696545&x-signature=WedfaLUOaeog5xv%2BOUkWX5TFHJA%3D)

    -   不建议同时定义cache和maxvalue或minvalue。因为定义cache后不能保证序列的连续性,可能会产生空洞,造成序列号段浪费。如对并发性能有要求,请同时参考guc参数session_sequence_cache。
    -   cache指定了单CN/DN一次向GTM中申请的值;session_sequence_cache指定的是单个会话一次向CN/DN申请缓存的值,会话结束后会自动丢弃。

-   **CYCLE**

    可选。用于使序列达到maxvalue或者minvalue后可循环并继续下去。

    如果声明了NO CYCLE,则在序列达到其最大值后任何对nextval的调用都会返回一个错误。

    -   NOCYCLE的作用等价于NO CYCLE。缺省值为NO CYCLE。
    -   若定义序列为CYCLE,则不能保证序列的唯一性。

-   **OWNED BY**

    可选。将序列和一个表的指定字段进行关联。这样,在删除该字段或其所在表的时候会自动删除已关联的序列。关联的表和序列的所有者必须是同一个用户,并且在同一个模式中。需要注意的是,通过指定OWNED BY,仅仅是建立了表的对应列和SEQUENCE之间关联关系,并不会在插入数据时在该列上产生自增序列。

    缺省值为OWNED BY NONE,表示不存在这样的关联。

    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/7c3510ba0b294e71821e92c8af941a27~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1772696545&x-signature=8cGccwOxvuXR%2BYNDD1tkunUAtWQ%3D)NOTICE:

    通过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   ----+-------   3 | Ben   1 | Joe   2 | Scott (3 rows)  --删除序列和表。 gaussdb=# DROP SEQUENCE test_seq2 CASCADE; gaussdb=# DROP TABLE test1; 
    ``` |
    | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

#### 相关链接

[DROP SEQUENCE](https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/devg-dist/gaussdb-12-0616.html#ZH-CN_TOPIC_0000001911585553),[ALTER SEQUENCE](https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/devg-dist/gaussdb-12-0504.html#ZH-CN_TOPIC_0000001911585213)

更多详情请参考GaussDB 文档中心:<https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/productdesc/qlh_03_0001.html>