==============
ALTER SEQUENCE
==============


.. container:: refentry
   :name: SQL-ALTERSEQUENCE

   .. container:: titlepage

   .. container:: refnamediv

      .. rubric:: ALTER SEQUENCE
         :name: alter-sequence

      ALTER SEQUENCE — 更改一个序列发生器的定义

   .. container:: refsynopsisdiv

      .. rubric:: 大纲
         :name: 大纲

      .. code:: synopsis

         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

   .. container:: refsect1
      :name: id-1.9.3.30.5

      .. rubric:: 描述
         :name: 描述

      ``ALTER SEQUENCE``\ 更改一个现有序列发生器的参数。
      任何没有在\ ``ALTER SEQUENCE``\ 命令中明确设置的参数
      保持它们之前的设置。

      要使用\ ``ALTER SEQUENCE``\ ,你必须拥有该序列。要更改一个序列
      的模式,你还必须拥有新模式上的\ ``CREATE``\ 特权。要更改拥有者,你还必须
      是新拥有角色的一个直接或者间接成员,并且该角色必须具有该域的模式上的
      ``CREATE``\ 特权(这些限制强制修改拥有者不能做一些通过删除和重
      建该序列做不到的事情。不过,一个超级用户怎么都能更改任何序列的所有权。)。

   .. container:: refsect1
      :name: id-1.9.3.30.6

      .. rubric:: 参数
         :name: 参数

      .. container:: variablelist

         *``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 NONE``
            ``OWNED BY``\ 选项导致该序列与一个特定的表列相关联,
            这样如果该列(或者整个表)被删除,该序列也会被自动删除。如果指定,
            这种关联会替代之前为该序列指定的任何关联。被指定的表必须具有相同的
            拥有者并且与该序列在同一个模式中。指定
            ``OWNED BY NONE``\ 可以移除任何现有的关联,让该序列 “自立”。

         *``new_owner``*
            该序列的新拥有者的用户名。

         *``new_name``*
            该序列的新名称。

         *``new_schema``*
            该序列的新模式。

   .. container:: refsect1
      :name: id-1.9.3.30.7

      .. rubric:: 注解
         :name: 注解

      ``ALTER SEQUENCE``\ 将不会立即影响除当前后端外
      其他后端中的\ ``nextval``\ 结果,因为它们有预分配(缓存)的序列
      值。在注意到序列生成参数被更改之前它们将用尽所有缓存的值。当前后端将被
      立刻影响。

      ``ALTER SEQUENCE``\ 不会影响该序列的 ``currval``\ 状态。

      ``ALTER SEQUENCE``\ 阻塞并发\ ``nextval``\ 、
      ``currval``\ 、\ ``lastval``\ 和 ``setval``\ 调用。

      由于历史原因,\ ``ALTER TABLE``\ 也可以被用于序列,
      但是只有等效于上述形式的\ ``ALTER TABLE``\ 变体才被 允许用于序列。

   .. container:: refsect1
      :name: id-1.9.3.30.8

      .. rubric:: 示例
         :name: 示例

      在 105 重启一个被称为\ ``serial``\ 的序列:

      .. code:: programlisting

         ALTER SEQUENCE serial RESTART WITH 105;

   .. container:: refsect1
      :name: id-1.9.3.30.9

      .. rubric:: 兼容性
         :name: 兼容性

      ``ALTER SEQUENCE``\ 符合SQL
      标准,不过\ ``AS``\ 、\ ``START WITH``\ 、
      ``OWNED BY``\ 、\ ``OWNER TO``\ 、\ ``RENAME TO``
      以及\ ``SET SCHEMA``\ 子句是 OushuDB 扩展。

   .. container:: refsect1
      :name: id-1.9.3.30.10

      .. rubric:: 另见
         :name: 另见

      `CREATE SEQUENCE <sql-createsequence.html>`__, `DROP
      SEQUENCE <sql-dropsequence.html>`__