ALTER SEQUENCE — 更改序列发生器的定义
ALTER SEQUENCE [ IF EXISTS ]name[ ASdata_type] [ INCREMENT [ BY ]increment] [ MINVALUEminvalue| NO MINVALUE ] [ MAXVALUEmaxvalue| NO MAXVALUE ] [ [ NO ] CYCLE ] [ START [ WITH ]start] [ RESTART [ [ WITH ]restart] ] [ CACHEcache] [ OWNED BY {table_name.column_name| NONE } ] ALTER SEQUENCE [ IF EXISTS ]nameSET { LOGGED | UNLOGGED } ALTER SEQUENCE [ IF EXISTS ]nameOWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER SEQUENCE [ IF EXISTS ]nameRENAME TOnew_nameALTER SEQUENCE [ IF EXISTS ]nameSET SCHEMAnew_schema
ALTER SEQUENCE更改现有序列发生器的参数。在 ALTER SEQUENCE命令中未明确设置的参数,会保留其原有设置。
要使用ALTER SEQUENCE,你必须拥有该序列。要更改序列所在的模式, 你还必须在新模式上具有CREATE权限。要更改拥有者,你必须能够对新的拥有角色执行 SET ROLE,并且该角色必须在该序列所在模式上具有CREATE权限。 (这些限制确保更改拥有者不会做出任何你不能通过删除并重建该序列来完成的事情。 不过,超级用户无论如何都可以更改任何序列的所有权。)
name要更改的序列名称(可以是模式限定的)。
IF EXISTS如果该序列不存在,则不要抛出错误。这种情况下会发出一条提示。
data_type可选子句AS 更改序列的数据类型。有效类型是 data_typesmallint、integer和 bigint。
当且仅当前一个最小值和最大值就是旧数据类型的最小值或最大值时,更改数据类型才会自动更改序列的最小值和最大值(换句话说,如果该序列在创建时隐式或显式使用了NO MINVALUE或NO MAXVALUE)。 否则,最小值和最大值会被保留,除非在同一条命令中给出了新值。如果最小值和最大值无法适配新数据类型,则会产生错误。
increment子句INCREMENT BY 是可选的。正值会创建升序序列, 负值会创建降序序列。如果未指定,则保留原有的增量值。increment
minvalueNO MINVALUE可选子句MINVALUE 确定序列可生成的最小值。 如果指定了minvalueNO MINVALUE,则升序序列和降序序列将分别使用默认值 1 和该数据类型的最小值。 如果两种选项都未指定,则保留当前最小值。
maxvalueNO MAXVALUE可选子句MAXVALUE 确定序列的最大值。 如果指定了maxvalueNO MAXVALUE,则升序序列和降序序列将分别使用该数据类型的最大值和默认值 -1。 如果两种选项都未指定,则保留当前最大值。
CYCLE可选关键字CYCLE可用于让序列在升序序列达到maxvalue、 或降序序列达到minvalue时回绕。 达到限制后,下一个生成的数字将分别是minvalue或 maxvalue。
NO CYCLE如果指定了可选关键字NO CYCLE,则当序列达到其最大值后,任何对 nextval的调用都会返回错误。如果既未指定CYCLE也未指定 NO CYCLE,则保留原有的循环行为。
start可选子句START WITH 更改序列记录的起始值。 这不会影响当前序列值;它只是设置未来startALTER SEQUENCE RESTART命令将使用的值。
restart可选子句RESTART [ WITH 更改序列的当前值。 这类似于以restart ]is_called = false调用setval函数: 指定的值会由对nextval的下一次调用返回。 写成不带restart值的RESTART,等价于提供 由CREATE SEQUENCE记录、或最近由ALTER SEQUENCE START WITH设置的起始值。
与setval调用相比,对序列执行RESTART操作具有事务性, 并且会阻止并发事务从同一序列中获取数字。如果这不是所期望的操作模式, 则应使用setval。
cache子句CACHE 允许预分配序列号并将其存储在内存中,以便更快访问。 最小值为 1(一次只能生成一个值,也就是不使用缓存)。如果未指定,则保留原有的缓存值。cache
SET { LOGGED | UNLOGGED }这种形式将序列从未记录改为已记录,或反之亦然(见CREATE SEQUENCE)。 它不能应用于临时序列。
OWNED BY table_name.column_nameOWNED BY NONEOWNED BY选项使该序列与某个特定表列关联起来,这样如果该列 (或其整张表)被删除,该序列也会自动删除。如果指定了该关联,它会替换该序列此前指定的任何关联。 指定的表必须与该序列具有相同的拥有者,并且位于同一模式中。指定OWNED BY NONE 会移除任何现有关联,使该序列成为“独立的”。
new_owner该序列的新拥有者的用户名。
new_name该序列的新名称。
new_schema该序列的新模式。
ALTER SEQUENCE不会立即影响除当前后端之外、已经预分配(缓存)了序列值的其他后端中的 nextval结果。它们会先用完所有缓存值,然后才会注意到序列生成参数已经改变。 当前后端则会立即受到影响。
ALTER SEQUENCE不会影响该序列的currval状态。 (在PostgreSQL 8.3 之前,它有时会这样做。)
ALTER SEQUENCE会阻塞并发的nextval、 currval、lastval和setval调用。
由于历史原因,序列也可以使用ALTER TABLE;但允许用于序列的 ALTER TABLE变体仅限于与上述形式等价的那些。
将一个名为serial的序列重启到 105:
ALTER SEQUENCE serial RESTART WITH 105;
ALTER SEQUENCE符合SQL标准,但 AS、START WITH、 OWNED BY、OWNER TO、RENAME TO和 SET SCHEMA子句是PostgreSQL扩展。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。