Maciek,

>Hi,
>
>Is this correct for MySQL to increment the auto_increment counter if the
>INSERT query fails? For example:
>
>mysql> CREATE TABLE test ( i INT NOT NULL AUTO_INCREMENT, c CHAR(16) NOT
>NULL, PRIMARY KEY(i), UNIQUE(c)) type=InnoDB;
>Query OK, 0 rows affected (0.25 sec)
>
>mysql> INSERT INTO test VALUES('', 'test1');
>Query OK, 1 row affected (0.05 sec)
>
>mysql> INSERT INTO test VALUES('', 'test2');
>Query OK, 1 row affected (0.24 sec)
>
>mysql> INSERT INTO test VALUES('', 'test2');
>ERROR 1062: Duplicate entry 'test2' for key 2
>mysql> INSERT INTO test VALUES('', 'test3');
>Query OK, 1 row affected (0.02 sec)
>
>mysql> SELECT * FROM test;
>+---+-------+
>| i | c     |
>+---+-------+
>| 1 | test1 |
>| 2 | test2 |
>| 4 | test3 |
>+---+-------+
>3 rows in set (0.00 sec)

auto-inc values are assigned past the transactional mechanism, for
efficiency, and to avoid deadlocks. Therefore a rollback following a failing
insert statement does not roll back the counter.

If you want a strictly contiguous sequence of values, use the standard
technique of a counter row in another table, from which you assign the
values to your insert statements.

CREATE TABLE test_counter(a INT) TYPE = INNODB;

SELECT a FROM testcounter FOR UPDATE;

UPDATE testcounter SET a = a + 1;

INSERT INTO test (...);

Regards,

Heikki



---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to