Autoincrement FAQ
How do I get the last inserted auto_increment value?
SELECT LAST_INSERT_ID();
What if someone else inserts before I select my id?
LAST_INSERT_ID()
is connection specific, so there is no problem from race conditions.
How do I get the next value to be inserted?
You don't. Insert, then find out what you did with LAST_INSERT_ID()
.
How do I change what number auto_increment starts with?
ALTER TABLE yourTable AUTO_INCREMENT = x;
-- Next insert will contain x or MAX(autoField) + 1, whichever is higher
or
INSERT INTO yourTable (autoField) VALUES (x);
-- Next insert will contain x+1 or MAX(autoField) + 1, whichever is higher
Issuing TRUNCATE TABLE will delete all the rows in the table, and will reset the auto_increment value to 0 in most cases (some earlier versions mapped TRUNCATE to DELETE for InnoDB tables, meaning the auto_increment value would not be reset).
How do I renumber rows once I've deleted some in the middle?
Typically, you don't want to. Gaps are hardly ever a problem; if your application can't handle gaps in the sequence, you probably should rethink your application.
Can I do group-wise auto_increment?
Yes, if you use the MyISAM engine. See the manual for an example.
How do I get the auto_increment value in a BEFORE INSERT
trigger?
You don't. It's only available after insert.
How do I assign two fields the same auto_increment value in one query?
You can't, not even with an AFTER INSERT trigger. Insert, then go back and update using LAST_INSERT_ID()
. Those two statements could be wrapped into one stored procedure if you wish.
However, you can mimic this behavior with a BEFORE INSERT trigger and a second table to store the sequence position:
CREATE TABLE sequence (table_name VARCHAR(255), position INT UNSIGNED); INSERT INTO sequence VALUES ('testTable', 0); CREATE TABLE testTable (firstAuto INT UNSIGNED, secondAuto INT UNSIGNED); DELIMITER // CREATE TRIGGER testTable_BI BEFORE INSERT ON testTable FOR EACH ROW BEGIN UPDATE sequence SET position = LAST_INSERT_ID(position + 1) WHERE table_name = 'testTable'; SET NEW.firstAuto = LAST_INSERT_ID(); SET NEW.secondAuto = LAST_INSERT_ID(); END// DELIMITER ; INSERT INTO testTable VALUES (NULL, NULL), (NULL, NULL); SELECT * FROM testTable;
+-----------+------------+ | firstAuto | secondAuto | +-----------+------------+ | 1 | 1 | | 2 | 2 | +-----------+------------+
The same sequence table can maintain separate sequences for multiple tables (or separate sequences for different fields in the same table) by adding extra rows.
Does the auto_increment field have to be primary key?
No, it only has to be indexed. It doesn't even have to be unique.
InnoDB and AUTO_INCREMENT
http://dev.mysql.com/doc/refman/5.0/en/innodb-auto-increment-column.html
General Information To Read
http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
Manual Notes
There can be only one AUTO_INCREMENT column per table, it must be indexed, and it cannot have a DEFAULT value. An AUTO_INCREMENT column works properly only if it contains only positive values. Inserting a negative number is regarded as inserting a very large positive number. This is done to avoid precision problems when numbers “wrap†over from positive to negative and also to ensure that you do not accidentally get an AUTO_INCREMENT column that contains 0.
How to start a table with a set AUTO_INCREMENT value?
mysql> CREATE TABLE autoinc_test ( -> h INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, -> m INT UNSIGNED -> ) AUTO_INCREMENT = 100; Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO autoinc_test ( m ) VALUES ( 1 ); Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM autoinc_test; +-----+------+ | h | m | +-----+------+ | 100 | 1 | +-----+------+ 1 row in set (0.00 sec)