中小型网站建设如何,如何做交互式网站,手机浏览网页在线代理,贵港seo一、概述 在 PostgreSQL 中#xff0c;序列用于生成唯一标识符#xff0c;通常用于为表的主键列生成连续的唯一值。若目的仅是为表字段设置自增 id#xff0c;可考虑序列类型来实现#xff0c;可参考《PostgreSql 设置自增字段》
二、创建序列
2.1 语法
CREATE [ TEMPOR…一、概述 在 PostgreSQL 中序列用于生成唯一标识符通常用于为表的主键列生成连续的唯一值。若目的仅是为表字段设置自增 id可考虑序列类型来实现可参考《PostgreSql 设置自增字段》
二、创建序列
2.1 语法
CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] name [ INCREMENT [ BY ] increment ][ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ][ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ][ OWNED BY { table_name.column_name | NONE } ]参数说明 TEMPORARY or TEMP如果被指定只会为这个会话创建序列对象并且在会话退出时自动删除它。当临时序列存在时已有的同名永久序列在这个会话中会变得不可见不过可以用模式限定的名称来引用同名永久序列。 IF NOT EXISTS如果已经存在一个同名的关系时不要抛出错误。这种情况下会发出一个提示。注意这不保证现有的关系与即将创建的序列相似它甚至可能都不是一个序列。 name要创建的序列的名称可以是模式限定的。 data_type可选的子句 AS data_type 制定序列的数据类型。有效类型是 smallint、integer、和 bigint。默认是 bigint。 数据类型决定了序列的默认最小和最大值。 increment可选的子句 INCREMENT BY increment 指定为了创建新值会把哪个值加到当前序列值上。一个正值将会创造一个上升序列负值会创造一个下降序列。默认值是 1。 minvalue|NO MINVALUE可选的子句 MINVALUE minvalue 决定一个序列能产生的最小值。如果没有提供这个子句或者指定了 NO MINVALUE那么会使用默认值。升序序列的默认值为1。降序序列的默认值为数据类型的最小值。 maxvalue|NO MAXVALUE可选的子句 MAXVALUE maxvalue 决定该序列的最大值。如果没有提供这个子句或者指定了 NO MAXVALUE那么将会使用默认值。升序序列的默认值是数据类型的最大值。降序序列的默认值是 -1。 start可选的子句 START WITH start 允许序列从任何地方开始。对于上升序列和下降序列来说默认的开始值分别是 minvalue 和 maxvalue。 cache可选的子句 CACHE cache 指定要预分配多少个序列数并且把它们放在内存中以便快速访问。最小值为 1 一次只生成 一个值即没有缓存默认值也是 1。 CYCLE|NO CYCLE对于上升序列和下降序列CYCLE 选项允许序列 在分别达到 maxvalue 和 minvalue 时回卷。如果达到该限制下一个产生的数字将分别是 minvalue 和 maxvalue。如果指定了 NO CYCLE当序列到达其最大值后任何 nextval 调用将返回一个错误。如果 CYCLE 和 NO CYCLE 都没有被指定则默认为 NO CYCLE。 OWNED BY table_name.column_name|OWNED BY NONEOWNED BY 选项导致序列被与一个特定的表列关联在一起这样如果该列或者整个表被删除该序列也将被自动删除。指定的表必须和序列具有相同的拥有者并且在同一个模式中。默认选项 OWNED BY NONE指定该序列不与某个列关联。 常用操作函数
操作函数描述nextval ( regclass ) → bigint将序列对象推进到下一个值并返回该值。setval ( regclass, bigint [, boolean ] ) → bigint设置序列对象的当前值boolean 为 false 时设置下个序列值。currval ( regclass ) → bigint返回 nextval 在当前会话中为该序列最近获取的值。lastval () → bigint返回 nextval 在当前会话中最近返回的值。
2.2 示例
--创建序列
postgres# create sequence seq_t;
CREATE SEQUENCE--插入数据时使用序列
postgres# insert into t values(nextval(seq_t),zhao);
INSERT 0 1
postgres# insert into t values(nextval(seq_t),qian);
INSERT 0 1
postgres# insert into t values(nextval(seq_t),sun);
INSERT 0 1
postgres# select * from t;id | name
----------1 | zhao2 | qian3 | sun
(3 rows)--查询序列当前值
postgres# select currval(seq_t);currval
---------3
(1 row)--更新序列值为下一个
postgres# select nextval(seq_t);nextval
---------4
(1 row)postgres# select currval(seq_t);currval
---------4
(1 row)--设置序列为指定值
postgres# select setval(seq_t,100);setval
--------100
(1 row)postgres# select currval(seq_t);currval
---------100
(1 row)--建表时字段默认使用序列通常序列字段设置为主键
postgres# create table t(id int default nextval(seq_t)primary key,name varchar);
CREATE TABLE
postgres# \d tTable public.tColumn | Type | Collation | Nullable | Default
----------------------------------------------------------------------------id | integer | | not null | nextval(seq_t::regclass)name | character varying | | |
Indexes:t_pkey PRIMARY KEY, btree (id)三、修改序列
3.1 语法
ALTER SEQUENCE [ IF EXISTS ] name[ AS data_type ][ INCREMENT [ BY ] increment ][ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ][ START [ WITH ] start ][ RESTART [ [ WITH ] restart ] ][ CACHE cache ] [ [ NO ] CYCLE ][ OWNED BY { table_name.column_name | NONE } ]
ALTER SEQUENCE [ IF EXISTS ] name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER SEQUENCE [ IF EXISTS ] name RENAME TO new_name
ALTER SEQUENCE [ IF EXISTS ] name SET SCHEMA new_schema参数说明 name要修改的序列的名称可以是模式限定的。 IF EXISTS在序列不存在时不要抛出一个错误。这种情况下会发出一个提示。 data_type可选子句 AS data_type 改变序列的数据类型。有效类型是 smallint、integer 和 bigint。当且仅当先前的最小值和最大值是旧数据类型的最小值或最大值时换句话说如果序列是使用 NO MINVALUE 或 NO MAXVALUE隐式或显式创建的则更改数据类型会自动更改序列的最小值和最大值。否则将保留最小值和最大值除非将新值作为同一命令的一部分给出。如果最小值和最大值不符合新的数据类型则会生成错误。 increment子句 INCREMENT BY increment 是可选的。一个正值将产生一个上升序列一个负值会产生一个下降序列。如果没有指定旧的增量值将被保持。 minvalue|NO MINVALUE可选的子句 MINVALUE minvalue 决定一个序列能产生的最小值。如果指定了 NO MINVALUE上升序列和下降序列的默认值分别是 1 和 数据类型的最小值。如果这些选项都没有被指定将保持当前的最小值。 maxvalue|NO MAXVALUE可选的子句 MAXVALUE maxvalue 决定一个序列能产生的最大值。如果指定了 NO MAXVALUE上升序列和下降序列的默认值分别是数据类型的最大值和 -1。如果这些选项都没有被指定将保持当前的最大值。 start可选的子句 START WITH start 更改该序列被记录的开始值。这对于当前序列值没有影响它会简单地设置未来 ALTER SEQUENCE RESTART 命令将会使用的值。 restart可选的子句 RESTART [ WITH restart ] 更改该序列的当前值。这类似于用 is_called false 调用setval函数被指定的值将会被 下一次 nextval 调用返回。写上没有 restart 值的 RESTART 等效于提供被 CREATE SEQUENCE 记录的或者上一次被 ALTER SEQUENCE START WITH 设置的开始值。与 setval 调用相比序列上的 RESTART 操作是事务性的并阻止并发事务从同一序列中获取数字。如果这不是所需的操作模式则应使用 setval。 cache子句 CACHE cache 使得序列数字被预先分配并且保存在内存中以便更快的访问。最小值是 1每次只产生一个值即无缓存。如果没有指定旧的缓冲值将被保持。 CYCLE可选的 CYCLE 关键词可以被用来允许该序列在达到 maxvalue上升序列或 minvalue下降序列时回卷。如果到达该限制下一个被产生的数字将分别是 minvalue 或者 maxvalue。 NO CYCLE如果指定了可选的 NO CYCLE 关键词任何在该序列到达其最大值后的 nextval 调用将会返回一个错误。如果既没有指定 CYCLE 也没有指定 NO CYCLE旧的循环行为将被保持。 OWNED BY table_name.column_name|OWNED BY NONEOWNED BY 选项导致该序列与一个特定的表列相关联这样如果该列或者整个表被删除该序列也会被自动删除。如果指定这种关联会替代之前为该序列指定的任何关联。被指定的表必须具有相同的 拥有者并且与该序列在同一个模式中。指定 OWNED BY NONE 可以移除任何现有的关联让该序列 “自立”。 new_owner该序列的新拥有者的用户名。 new_name该序列的新名称。 new_schema该序列的新模式。 3.2 示例
--修改序列隶属于表删除表时索引也关联删除
postgres# alter sequence seq_t owned by t.id;
ALTER SEQUENCE
postgres# \d seq_tSequence public.seq_tType | Start | Minimum | Maximum | Increment | Cycles? | Cache
------------------------------------------------------------------------bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1
Owned by: public.t.idpostgres# drop table t;
DROP TABLE
postgres# \d seq_t
Did not find any relation named seq_t.四、删除序列
4.1 语法
DROP SEQUENCE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]参数说明 IF EXISTS如果该序列不存在则不要抛出一个错误而是发出一个提示。 name一个序列的名称可以是模式限定的。 CASCADE自动删除依赖于该序列的对象然后删除所有依赖于那些对象的对象。 RESTRICT如果有任何对象依赖于该序列则拒绝删除它。这是默认值。 4.2 示例
postgres# drop sequence seq_t;
DROP SEQUENCE