~ubuntu-branches/ubuntu/wily/sqlite3/wily

« back to all changes in this revision

Viewing changes to autoinc.html

  • Committer: Package Import Robot
  • Author(s): Laszlo Boszormenyi (GCS)
  • Date: 2012-06-13 21:43:48 UTC
  • mto: This revision was merged to the branch mainline in revision 23.
  • Revision ID: package-import@ubuntu.com-20120613214348-uy14uupdeq0hh04k
Tags: upstream-3.7.13/www
Import upstream version 3.7.13, component www

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
 
2
<html><head>
 
3
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
 
4
<title>SQLite Autoincrement</title>
 
5
<style type="text/css">
 
6
body {
 
7
    margin: auto;
 
8
    font-family: Verdana, sans-serif;
 
9
    padding: 8px 1%;
 
10
}
 
11
 
 
12
a { color: #044a64 }
 
13
a:visited { color: #734559 }
 
14
 
 
15
.logo { position:absolute; margin:3px; }
 
16
.tagline {
 
17
  float:right;
 
18
  text-align:right;
 
19
  font-style:italic;
 
20
  width:300px;
 
21
  margin:12px;
 
22
  margin-top:58px;
 
23
}
 
24
 
 
25
.toolbar {
 
26
  text-align: center;
 
27
  line-height: 1.6em;
 
28
  margin: 0;
 
29
  padding: 0px 8px;
 
30
}
 
31
.toolbar a { color: white; text-decoration: none; padding: 6px 12px; }
 
32
.toolbar a:visited { color: white; }
 
33
.toolbar a:hover { color: #044a64; background: white; }
 
34
 
 
35
.content    { margin: 5%; }
 
36
.content dt { font-weight:bold; }
 
37
.content dd { margin-bottom: 25px; margin-left:20%; }
 
38
.content ul { padding:0px; padding-left: 15px; margin:0px; }
 
39
 
 
40
/* rounded corners */
 
41
.se  { background: url(images/se.gif) 100% 100% no-repeat #044a64}
 
42
.sw  { background: url(images/sw.gif) 0% 100% no-repeat }
 
43
.ne  { background: url(images/ne.gif) 100% 0% no-repeat }
 
44
.nw  { background: url(images/nw.gif) 0% 0% no-repeat }
 
45
 
 
46
/* Things for "fancyformat" documents start here. */
 
47
.fancy img+p {font-style:italic}
 
48
.fancy .codeblock i { color: darkblue; }
 
49
.fancy h1,.fancy h2,.fancy h3,.fancy h4 {font-weight:normal;color:#044a64}
 
50
.fancy h2 { margin-left: 10px }
 
51
.fancy h3 { margin-left: 20px }
 
52
.fancy h4 { margin-left: 30px }
 
53
.fancy th {white-space:nowrap;text-align:left;border-bottom:solid 1px #444}
 
54
.fancy th, .fancy td {padding: 0.2em 1ex; vertical-align:top}
 
55
.fancy #toc a        { color: darkblue ; text-decoration: none }
 
56
.fancy .todo         { color: #AA3333 ; font-style : italic }
 
57
.fancy .todo:before  { content: 'TODO:' }
 
58
.fancy p.todo        { border: solid #AA3333 1px; padding: 1ex }
 
59
.fancy img { display:block; }
 
60
.fancy :link:hover, .fancy :visited:hover { background: wheat }
 
61
.fancy p,.fancy ul,.fancy ol { margin: 1em 5ex }
 
62
.fancy li p { margin: 1em 0 }
 
63
/* End of "fancyformat" specific rules. */
 
64
 
 
65
</style>
 
66
  
 
67
</head>
 
68
<body>
 
69
<div><!-- container div to satisfy validator -->
 
70
 
 
71
<a href="index.html">
 
72
<img class="logo" src="images/sqlite370_banner.gif" alt="SQLite Logo"
 
73
 border="0"></a>
 
74
<div><!-- IE hack to prevent disappearing logo--></div>
 
75
<div class="tagline">Small. Fast. Reliable.<br>Choose any three.</div>
 
76
 
 
77
<table width=100% style="clear:both"><tr><td>
 
78
  <div class="se"><div class="sw"><div class="ne"><div class="nw">
 
79
  <table width=100% style="padding:0;margin:0;cell-spacing:0"><tr>
 
80
  <td width=100%>
 
81
  <div class="toolbar">
 
82
    <a href="about.html">About</a>
 
83
    <a href="sitemap.html">Sitemap</a>
 
84
    <a href="docs.html">Documentation</a>
 
85
    <a href="download.html">Download</a>
 
86
    <a href="copyright.html">License</a>
 
87
    <a href="news.html">News</a>
 
88
    <a href="support.html">Support</a>
 
89
  </div>
 
90
<script>
 
91
  gMsg = "Search SQLite Docs..."
 
92
  function entersearch() {
 
93
    var q = document.getElementById("q");
 
94
    if( q.value == gMsg ) { q.value = "" }
 
95
    q.style.color = "black"
 
96
    q.style.fontStyle = "normal"
 
97
  }
 
98
  function leavesearch() {
 
99
    var q = document.getElementById("q");
 
100
    if( q.value == "" ) { 
 
101
      q.value = gMsg
 
102
      q.style.color = "#044a64"
 
103
      q.style.fontStyle = "italic"
 
104
    }
 
105
  }
 
106
</script>
 
107
<td>
 
108
    <div style="padding:0 1em 0px 0;white-space:nowrap">
 
109
    <form name=f method="GET" action="http://www.sqlite.org/search">
 
110
      <input id=q name=q type=text
 
111
       onfocus="entersearch()" onblur="leavesearch()" style="width:24ex;padding:1px 1ex; border:solid white 1px; font-size:0.9em ; font-style:italic;color:#044a64;" value="Search SQLite Docs...">
 
112
      <input type=submit value="Go" style="border:solid white 1px;background-color:#044a64;color:white;font-size:0.9em;padding:0 1ex">
 
113
    </form>
 
114
    </div>
 
115
  </table>
 
116
</div></div></div></div>
 
117
</td></tr></table>
 
118
<div class=startsearch></div>
 
119
  
 
120
 
 
121
<h1>SQLite Autoincrement</h1>
 
122
 
 
123
 
 
124
<p>
 
125
In SQLite, every row of every table has an 64-bit signed integer <a href="lang_createtable.html#rowid">ROWID</a>.
 
126
The ROWID for each row is unique among all rows in the same table.
 
127
</p>
 
128
 
 
129
<p>
 
130
You can access the ROWID of an SQLite table using one the special column
 
131
names ROWID, _ROWID_, or OID.
 
132
Except if you declare an ordinary table column to use one of those special
 
133
names, then the use of that name will refer to the declared column not
 
134
to the internal ROWID.
 
135
</p>
 
136
 
 
137
<p>
 
138
If a table contains a column of type <a href="lang_createtable.html#rowid">INTEGER PRIMARY KEY</a>, then that
 
139
column becomes an alias for the ROWID.  You can then access the ROWID
 
140
using any of four different names, the original three names described above
 
141
or the name given to the <a href="lang_createtable.html#rowid">INTEGER PRIMARY KEY</a> column.  All these names are
 
142
aliases for one another and work equally well in any context.
 
143
</p>
 
144
 
 
145
<p>
 
146
When a new row is inserted into an SQLite table, the ROWID can either
 
147
be specified as part of the INSERT statement or it can be assigned
 
148
automatically by the database engine.  To specify a ROWID manually,
 
149
just include it in the list of values to be inserted.  For example:
 
150
</p>
 
151
 
 
152
<blockquote><pre>
 
153
CREATE TABLE test1(a INT, b TEXT);
 
154
INSERT INTO test1(rowid, a, b) VALUES(123, 5, 'hello');
 
155
</pre></blockquote>
 
156
 
 
157
<p>
 
158
If no ROWID is specified on the insert, or if the specified ROWID has a value
 
159
of NULL, then an appropriate ROWID is created
 
160
automatically.  The usual algorithm is to give the newly created row
 
161
a ROWID that is one larger than the largest ROWID in the table prior
 
162
to the insert.  If the table is initially empty, then a ROWID of 1 is
 
163
used.  If the largest ROWID is equal to the largest possible integer
 
164
(9223372036854775807) then the database
 
165
engine starts picking positive candidate ROWIDs at random until it finds one
 
166
that is not previously used.
 
167
If no unused ROWID can be found after a reasonable number of attempts,
 
168
the insert operation fails with an <a href="c3ref/c_abort.html">SQLITE_FULL</a> error.
 
169
If no negative ROWID values are inserted explicitly, then automatically 
 
170
generated ROWID values will always be greater than zero.
 
171
</p>
 
172
 
 
173
<p>
 
174
The normal ROWID selection algorithm described above
 
175
will generate monotonically increasing
 
176
unique ROWIDs as long as you never use the maximum ROWID value and you never
 
177
delete the entry in the table with the largest ROWID. 
 
178
If you ever delete rows or if you ever create a row with the maximum possible
 
179
ROWID, then ROWIDs from previously deleted rows might be reused when creating
 
180
new rows and newly created ROWIDs might not be in strictly ascending order.
 
181
</p>
 
182
 
 
183
 
 
184
<h2>The AUTOINCREMENT Keyword</h2>
 
185
 
 
186
<p>
 
187
If a column has the type INTEGER PRIMARY KEY AUTOINCREMENT then a slightly
 
188
different ROWID selection algorithm is used.  
 
189
The ROWID chosen for the new row is at least one larger than the largest ROWID
 
190
that has ever before existed in that same table.  If the table has never
 
191
before contained any data, then a ROWID of 1 is used.  If the table
 
192
has previously held a row with the largest possible ROWID, then new INSERTs
 
193
are not allowed and any attempt to insert a new row will fail with an
 
194
SQLITE_FULL error.
 
195
</p>
 
196
 
 
197
<p>
 
198
SQLite keeps track of the largest ROWID that a table has ever held using
 
199
an <a href="fileformat2.html#intschema">internal table</a> named "<a href="fileformat2.html#seqtab">sqlite_sequence</a>".
 
200
The sqlite_sequence table is created
 
201
and initialized automatically whenever a normal table that contains an
 
202
AUTOINCREMENT column is created.  The content of the sqlite_sequence table
 
203
can be modified using ordinary UPDATE, INSERT, and DELETE statements.
 
204
But making modifications to this table will likely perturb the AUTOINCREMENT
 
205
key generation algorithm.  Make sure you know what you are doing before
 
206
you undertake such changes.
 
207
</p>
 
208
 
 
209
<p>
 
210
The behavior implemented by the AUTOINCREMENT keyword is subtly different
 
211
from the default behavior.  With AUTOINCREMENT, rows with automatically
 
212
selected ROWIDs are guaranteed to have ROWIDs that have never been used
 
213
before by the same table in the same database.  And the automatically generated
 
214
ROWIDs are guaranteed to be monotonically increasing.  These are important
 
215
properties in certain applications.  But if your application does not
 
216
need these properties, you should probably stay with the default behavior
 
217
since the use of AUTOINCREMENT requires additional work to be done
 
218
as each row is inserted and thus causes INSERTs to run a little slower.
 
219
</p>
 
220
 
 
221
<p>Note that "monotonically increasing" does not imply that the ROWID always
 
222
increases by exactly one.  One is the usual increment.  However, if an
 
223
insert fails due to (for example) a uniqueness constraint, the ROWID of
 
224
the failed insertion attempt might not be reused on subsequent inserts,
 
225
resulting in gaps in the ROWID sequence.  AUTOINCREMENT guarantees that
 
226
automatically chosen ROWIDs will be increasing but not that they will be
 
227
sequential.</p>
 
228