:: DEVELOPER ZONE
If you specify an AUTO_INCREMENT column for a
table, the InnoDB table handle in the data
dictionary contains a special counter called the auto-increment
counter that is used in assigning new values for the column. The
auto-increment counter is stored only in main memory, not on disk.
InnoDB uses the following algorithm to initialize
the auto-increment counter for a table T that
contains an AUTO_INCREMENT column named
ai_col: After a server startup, when a user first
does an insert to a table T,
InnoDB executes the equivalent of this statement:
SELECT MAX(ai_col) FROM T FOR UPDATE;
The value retrieved by the statement is incremented by one and
assigned to the column and the auto-increment counter of the table.
If the table is empty, the value 1 is assigned.
If the auto-increment counter is not initialized and the user
invokes a SHOW TABLE STATUS statement that
displays output for the table T, the counter is
initialized (but not incremented) and stored for use by later
inserts. Note that in this initialization we do a normal
exclusive-locking read on the table and the lock lasts to the end of
the transaction.
InnoDB follows the same procedure for
initializing the auto-increment counter for a freshly created table.
Note that if the user specifies NULL or
0 for the AUTO_INCREMENT
column in an INSERT, InnoDB
treats the row as if the value had not been specified and generates
a new value for it.
After the auto-increment counter has been initialized, if a user
inserts a row that explicitly specifies the column value, and the
value is bigger than the current counter value, the counter is set
to the specified column value. If the user does not explicitly
specify a value, InnoDB increments the counter by
one and assigns the new value to the column.
When accessing the auto-increment counter, InnoDB
uses a special table level AUTO-INC lock that it
keeps to the end of the current SQL statement, not to the end of the
transaction. The special lock release strategy was introduced to
improve concurrency for inserts into a table containing an
AUTO_INCREMENT column. Two transactions cannot
have the AUTO-INC lock on the same table
simultaneously.
Note that you may see gaps in the sequence of values assigned to the
AUTO_INCREMENT column if you roll back
transactions that have gotten numbers from the counter.
The behavior of the auto-increment mechanism is not defined if a user assigns a negative value to the column or if the value becomes bigger than the maximum integer that can be stored in the specified integer type.
Beginning with MySQL 5.0.3, InnoDB supports the
AUTO_INCREMENT =
table option in nCREATE TABLE and ALTER
TABLE statements, to set the initial counter value or
alter the current counter value. The effect of this option is
canceled by a server restart, for reasons discussed earlier in this
section.
© 1995-2005 MySQL AB. All rights reserved.

User Comments
Warning: query failed: Unknown column 'user.firstname' in 'field list' in /data0/sites/live/web-main/lib/mysql-cxn.php on line 69
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /data0/sites/live/web-main/lib/docbook.php on line 245
Add your own comment.