Spec-Zone .ru
спецификации, руководства, описания, API
|
The original implementation of auto-increment handling in InnoDB
uses the following
strategy to prevent problems when using the binary log for statement-based replication or for certain recovery
scenarios.
If you specify an AUTO_INCREMENT
column for an InnoDB
table, the table handle in the InnoDB
data dictionary contains a special counter
called the auto-increment counter that is used in assigning new values for the column. This 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, for the first insert into a table t
, InnoDB
executes the equivalent of this statement:
SELECT MAX(ai_col) FROM t FOR UPDATE;
InnoDB
increments the value retrieved by the statement and assigns it to the column
and to the auto-increment counter for the table. By default, the value is incremented by one. This default can
be overridden by the auto_increment_increment
configuration setting.
If the table is empty, InnoDB
uses the value 1
. This
default can be overridden by the auto_increment_offset
configuration setting.
If a SHOW TABLE STATUS
statement examines the table t
before the auto-increment counter is initialized, InnoDB
initializes but does not
increment the value and stores it for use by later inserts. This initialization uses 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.
After the auto-increment counter has been initialized, if you do not explicitly specify a value for an AUTO_INCREMENT
column, InnoDB
increments the counter and
assigns the new value to the column. If you insert 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 a user specifies NULL
or 0
for the AUTO_INCREMENT
column in an INSERT
,
InnoDB
treats the row as if the value was not specified and generates a new value
for it.
The behavior of the auto-increment mechanism is not defined if you assign 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.
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. Nevertheless, two transactions cannot
have the AUTO-INC
lock on the same table simultaneously, which can have a
performance impact if the AUTO-INC
lock is held for a long time. That might be the
case for a statement such as INSERT INTO t1 ... SELECT ... FROM t2
that inserts all
rows from one table into another.
InnoDB
uses the in-memory auto-increment counter as long as the server runs. When
the server is stopped and restarted, InnoDB
reinitializes the counter for each
table for the first INSERT
to the table, as described earlier.
A server restart also cancels the effect of the AUTO_INCREMENT =
table option in N
CREATE TABLE
and ALTER
TABLE
statements, which you can use with InnoDB
tables to set the
initial counter value or alter the current counter value.
You may see gaps in the sequence of values assigned to the AUTO_INCREMENT
column if
you roll back transactions that have generated numbers using the counter.