create_sequence.sgml 11.3 KB
Newer Older
1
<!--
2
$PostgreSQL: pgsql/doc/src/sgml/ref/create_sequence.sgml,v 1.42 2004/11/27 21:27:07 petere Exp $
3
PostgreSQL documentation
4 5
-->

6 7
<refentry id="SQL-CREATESEQUENCE">
 <refmeta>
8
  <refentrytitle id="sql-createsequence-title">CREATE SEQUENCE</refentrytitle>
9 10
  <refmiscinfo>SQL - Language Statements</refmiscinfo>
 </refmeta>
11

12
 <refnamediv>
13 14
  <refname>CREATE SEQUENCE</refname>
  <refpurpose>define a new sequence generator</refpurpose>
15
 </refnamediv>
16

Peter Eisentraut's avatar
Peter Eisentraut committed
17 18 19 20
 <indexterm zone="sql-createsequence">
  <primary>CREATE SEQUENCE</primary>
 </indexterm>

21
 <refsynopsisdiv>
22
<synopsis>
23
CREATE [ TEMPORARY | TEMP ] SEQUENCE <replaceable class="parameter">name</replaceable> [ INCREMENT [ BY ] <replaceable class="parameter">increment</replaceable> ]
Bruce Momjian's avatar
Bruce Momjian committed
24
    [ MINVALUE <replaceable class="parameter">minvalue</replaceable> | NO MINVALUE ] [ MAXVALUE <replaceable class="parameter">maxvalue</replaceable> | NO MAXVALUE ]
25
    [ START [ WITH ] <replaceable class="parameter">start</replaceable> ] [ CACHE <replaceable class="parameter">cache</replaceable> ] [ [ NO ] CYCLE ]
26
</synopsis>
27 28
 </refsynopsisdiv>

29 30 31
 <refsect1>
  <title>Description</title>

32
  <para>
33 34 35
   <command>CREATE SEQUENCE</command> creates a new sequence number
   generator.  This involves creating and initializing a new special
   single-row table with the name <replaceable
36
   class="parameter">name</replaceable>.  The generator will be
37
   owned by the user issuing the command.
38
  </para>
39

40 41
  <para>
   If a schema name is given then the sequence is created in the
42 43 44
   specified schema.  Otherwise it is created in the current schema.
   Temporary sequences exist in a special schema, so a schema name may not be
   given when creating a temporary sequence.
45 46 47 48
   The sequence name must be distinct from the name of any other sequence,
   table, index, or view in the same schema.
  </para>

49
  <para>
50 51
   After a sequence is created, you use the functions
   <function>nextval</function>,
52
   <function>currval</function>, and
53 54
   <function>setval</function>
   to operate on the sequence.  These functions are documented in
55
   <xref linkend="functions-sequence">.
56
  </para>
57

58
  <para>
59
   Although you cannot update a sequence directly, you can use a query like
60

61
<programlisting>
62
SELECT * FROM <replaceable>name</replaceable>;
63
</programlisting>
64

65 66
   to examine the parameters and current state of a sequence.  In particular,
   the <literal>last_value</> field of the sequence shows the last value
67 68
   allocated by any session.  (Of course, this value may be obsolete
   by the time it's printed, if other sessions are actively doing
69
   <function>nextval</> calls.)
70
  </para>
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
 </refsect1>

 <refsect1>
  <title>Parameters</title>

  <variablelist>
   <varlistentry>
    <term><literal>TEMPORARY</literal> or <literal>TEMP</literal></term>
    <listitem>
     <para>
      If specified, the sequence object is created only for this
      session, and is automatically dropped on session exit.  Existing
      permanent sequences with the same name are not visible (in this
      session) while the temporary sequence exists, unless they are
      referenced with schema-qualified names.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
91
    <term><replaceable class="parameter">name</replaceable></term>
92 93 94 95 96 97 98 99 100 101 102 103
    <listitem>
     <para>
      The name (optionally schema-qualified) of the sequence to be created.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="parameter">increment</replaceable></term>
    <listitem>
     <para>
      The optional clause <literal>INCREMENT BY <replaceable
Peter Eisentraut's avatar
Peter Eisentraut committed
104
      class="parameter">increment</replaceable></literal> specifies
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
      which value is added to the current sequence value to create a
      new value.  A positive value will make an ascending sequence, a
      negative one a descending sequence.  The default value is 1.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="parameter">minvalue</replaceable></term>
    <term><literal>NO MINVALUE</literal></term>
    <listitem>
     <para>
      The optional clause <literal>MINVALUE <replaceable
      class="parameter">minvalue</replaceable></literal> determines
      the minimum value a sequence can generate. If this clause is not
      supplied or <option>NO MINVALUE</option> is specified, then
      defaults will be used.  The defaults are 1 and
      -2<superscript>63</>-1 for ascending and descending sequences,
      respectively.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="parameter">maxvalue</replaceable></term>
    <term><literal>NO MAXVALUE</literal></term>
    <listitem>
     <para>
      The optional clause <literal>MAXVALUE <replaceable
      class="parameter">maxvalue</replaceable></literal> determines
      the maximum value for the sequence. If this clause is not
      supplied or <option>NO MAXVALUE</option> is specified, then
      default values will be used.  The defaults are
      2<superscript>63</>-1 and -1 for ascending and descending
      sequences, respectively.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="parameter">start</replaceable></term>
    <listitem>
     <para>
      The optional clause <literal>START WITH <replaceable
      class="parameter">start</replaceable> </literal> allows the
      sequence to begin anywhere.  The default starting value is
      <replaceable class="parameter">minvalue</replaceable> for
      ascending sequences and <replaceable
      class="parameter">maxvalue</replaceable> for descending ones.
     </para>
    </listitem>
   </varlistentry>
157

158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
   <varlistentry>
    <term><replaceable class="parameter">cache</replaceable></term>
    <listitem>
     <para>
      The optional clause <literal>CACHE <replaceable
      class="parameter">cache</replaceable></literal> specifies how
      many sequence numbers are to be preallocated and stored in
      memory for faster access. The minimum value is 1 (only one value
      can be generated at a time, i.e., no cache), and this is also the
      default.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><literal>CYCLE</literal></term>
    <term><literal>NO CYCLE</literal></term>
    <listitem>
     <para>
      The <literal>CYCLE</literal> option allows the sequence to wrap
      around when the <replaceable
      class="parameter">maxvalue</replaceable> or <replaceable
      class="parameter">minvalue</replaceable> has been reached by an
      ascending or descending sequence respectively. If the limit is
      reached, the next number generated will be the <replaceable
      class="parameter">minvalue</replaceable> or <replaceable
      class="parameter">maxvalue</replaceable>, respectively.
     </para>

     <para>
      If <literal>NO CYCLE</literal> is specified, any calls to
      <function>nextval</function> after the sequence has reached its
      maximum value will return an error.  If neither
      <literal>CYCLE</literal> or <literal>NO CYCLE</literal> are
      specified, <literal>NO CYCLE</literal> is the default.
     </para>
    </listitem>
   </varlistentry>
  </variablelist>
 </refsect1>

 <refsect1>
  <title>Notes</title>

202
  <para>
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
   Use <command>DROP SEQUENCE</command> to remove a sequence.
  </para>

  <para>
   Sequences are based on <type>bigint</> arithmetic, so the range
   cannot exceed the range of an eight-byte integer
   (-9223372036854775808 to 9223372036854775807).  On some older
   platforms, there may be no compiler support for eight-byte
   integers, in which case sequences use regular <type>integer</>
   arithmetic (range -2147483648 to +2147483647).
  </para>

  <para>
   Unexpected results may be obtained if a <replaceable
   class="parameter">cache</replaceable> setting greater than one is
   used for a sequence object that will be used concurrently by
   multiple sessions.  Each session will allocate and cache successive
   sequence values during one access to the sequence object and
   increase the sequence object's <literal>last_value</> accordingly.
   Then, the next <replaceable class="parameter">cache</replaceable>-1
   uses of <function>nextval</> within that session simply return the
   preallocated values without touching the sequence object.  So, any
   numbers allocated but not used within a session will be lost when
   that session ends, resulting in <quote>holes</quote> in the
   sequence.
  </para>

  <para>
   Furthermore, although multiple sessions are guaranteed to allocate
   distinct sequence values, the values may be generated out of
233
   sequence when all the sessions are considered.  For example, with
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
   a <replaceable class="parameter">cache</replaceable> setting of 10,
   session A might reserve values 1..10 and return
   <function>nextval</function>=1, then session B might reserve values
   11..20 and return <function>nextval</function>=11 before session A
   has generated <literal>nextval</literal>=2.  Thus, with a
   <replaceable class="parameter">cache</replaceable> setting of one
   it is safe to assume that <function>nextval</> values are generated
   sequentially; with a <replaceable
   class="parameter">cache</replaceable> setting greater than one you
   should only assume that the <function>nextval</> values are all
   distinct, not that they are generated purely sequentially.  Also,
   <literal>last_value</> will reflect the latest value reserved by
   any session, whether or not it has yet been returned by
   <function>nextval</>.
  </para>

  <para>
   Another consideration is that a <function>setval</> executed on
   such a sequence will not be noticed by other sessions until they
   have used up any preallocated values they have cached.
254
  </para>
255 256 257 258 259 260 261 262
 </refsect1>

 <refsect1>
  <title>Examples</title>

  <para>
   Create an ascending sequence called <literal>serial</literal>, starting at 101:
<programlisting>
263
CREATE SEQUENCE serial START 101;
264 265 266
</programlisting>
  </para>

267
  <para>
Bruce Momjian's avatar
Bruce Momjian committed
268
   Select the next number from this sequence:
269
<programlisting>
270
SELECT nextval('serial');
271

272 273 274 275
 nextval
---------
     114
</programlisting>
276
  </para>
277

278
  <para>
279 280
   Use this sequence in an <command>INSERT</command> command:
<programlisting>
281
INSERT INTO distributors VALUES (nextval('serial'), 'nothing');
282
</programlisting>
283
  </para>
Thomas G. Lockhart's avatar
Thomas G. Lockhart committed
284 285

  <para>
286 287
   Update the sequence value after a <command>COPY FROM</command>:
<programlisting>
288
BEGIN;
289 290
COPY distributors FROM 'input_file';
SELECT setval('serial', max(id)) FROM distributors;
291
END;
292
</programlisting>
Thomas G. Lockhart's avatar
Thomas G. Lockhart committed
293
  </para>
294 295
 </refsect1>

296 297 298 299
 <refsect1>
  <title>Compatibility</title>

  <para>
300 301 302 303 304 305
   <command>CREATE SEQUENCE</command> is is specified in <acronym>SQL:2003</acronym>.
   <productname>PostgreSQL</productname> conforms with the standard, with the following exceptions:
   <itemizedlist>
    <listitem><para>The standard's <literal>AS &lt;data type&gt;</literal> expression is not supported.</para></listitem>
    <listitem><para>Obtaining the next value is done using the <function>nextval()</> function instead of the standard's <command>NEXT VALUE FOR</command> expression.</para></listitem>
   </itemizedlist>
306
  </para>
307
 </refsect1>
308
</refentry>
309 310 311 312

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
313
sgml-omittag:nil
314 315 316 317 318 319 320 321 322 323 324
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"../reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:"/usr/lib/sgml/catalog"
sgml-local-ecat-files:nil
End:
325
-->