Автоинкремент сбрасывается на 0, но невозможно вставить значение с id=0. Не происходит для значений ›0

Я только что наткнулся на очень странное поведение:

Представьте, что у нас есть таблица клиентов:

MariaDB [connections]> describe customers;
+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| customerId   | int(11)     | NO   | PRI | NULL    | auto_increment |
| customerName | varchar(50) | NO   |     | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

Вставьте пару значений:

insert into customers(customerName) values('Foo');
insert into customers(customerName) values('Bar');

Затем удалите все и сбросьте автоинкремент:

DELETE FROM customers;
ALTER TABLE customers AUTO_INCREMENT = 0;

Теперь вставьте новое значение с идентификатором клиента = 0:

INSERT INTO customers(customerId,customerName) VALUES(0,'Site owner');

И посмотрите результат:

MariaDB [connections]> select * from customers;
+------------+--------------+
| customerId | customerName |
+------------+--------------+
|          1 | Site owner   |
+------------+--------------+
1 row in set (0.00 sec)

идентификатор клиента установлен на 1!!!!

Повторите ту же процедуру, но сбросьте на 5 и вставьте 5, все в порядке:

MariaDB [connections]> delete from customers;
Query OK, 1 row affected (0.00 sec)

MariaDB [connections]> ALTER TABLE customers AUTO_INCREMENT = 5;
Query OK, 0 rows affected (0.00 sec)               
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [connections]> INSERT INTO customers(customerId,customerName) VALUES(5,'Site owner');
Query OK, 1 row affected (0.00 sec)

MariaDB [connections]> select * from customers;
+------------+--------------+
| customerId | customerName |
+------------+--------------+
|          5 | Site owner   |
+------------+--------------+
1 row in set (0.00 sec)

Что здесь происходит? Как я могу вставить значение «0» со значениями вставки? (Да, я могу потом отредактировать, но по разным причинам это нецелесообразно для моего случая).

Спасибо!


person user2787266    schedule 17.09.2013    source источник
comment
Я могу сразу сказать вам одну вещь, вы можете мне поверить или просто бросить, забыть об этом и вспомнить то, что я вам сказал, когда дело дойдет до того, чтобы укусить вас за задницу (а это произойдет). НИКОГДА не полагайтесь на auto_increment для получения значений, которые имеют для вас значение. Auto_increment не используется, поэтому мы можем использовать его для последовательной нумерации. У него одна и только одна цель - однозначно идентифицировать строку. Это означает, что mysql может отбрасывать некоторые числа (при неудачной вставке), может смещать их, может использовать отрицательные значения и т. д. Просто оставьте это, если вам нужны какие-то специальные числа — добавьте еще один столбец или что-то в этом роде.   -  person N.B.    schedule 17.09.2013


Ответы (2)


Я сослался на ответ из ссылка

Вы можете использовать:

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'

Что, как описано здесь, предотвратит интерпретацию MySQL идентификатора INSERT/UPDATE, равного 0, как следующего идентификатора последовательности. Такое поведение будет ограничено значением NULL.

Это то, что я считаю довольно плохим поведением приложения. Вам нужно быть очень осторожным, чтобы он использовался последовательно, особенно если вы решите реализовать репликацию позже.

person Bala    schedule 17.09.2013
comment
Это работает из командной строки, но не использует $link-›query() mysqli. Я что-то упустил? - person user2787266; 18.09.2013
comment
Это спасло меня сегодня. Спасибо. - person NobleUplift; 07.11.2015

Это невозможно.

0 зарезервировано для поля auto_increment. Когда вы вставляете в строку автоматического увеличения 0 или null, тогда mysql вставляет запись с текущим значением автоматического увеличения.

person newman    schedule 17.09.2013