@hrvasiliy

Почему ID в БД идут не по порядку?

Есть таблица в БД с 2-мя полями: ID (AI + PK) и NAME (INDEX UNIQUE). При добавлении первой партии записей в поле NAME все ID расставляются как надо, по порядку. После добавления второй партии записей (Есть повторы, но для этого я и установил INDEX UNIQUE) ID уже расставляются не по порядку: 98, 99, 115, 175 и т.д. Подскажите, пожалуйста, в чем же причина? Можно, конечно, делать проверку на уникальность того или иного поля в коде, но для чего тогда INDEX UNIQUE...
  • Вопрос задан
  • 5194 просмотра
Решения вопроса 1
Я не наблюдаю эффекта ни с myisam, ни с innodb (версия сервера 5.0.45-community-nt MySQL Community Edition):
mysql> create table mytable(id bigint auto_increment primary key,name varchar(32) unique);
Query OK, 0 rows affected (0.01 sec)

mysql> insert ignore into mytable(name) values('aaa'),('bbb'),('ccc'),('aaa'),
mysql> ('ddd'),('eee'),('bbb'),('fff');
Query OK, 6 rows affected (0.02 sec)
Records: 8  Duplicates: 2  Warnings: 0

mysql> insert ignore into mytable(name) values('aaa'),('bbb'),('ccc'),('aaa'),
mysql> ('ddd'),('eee'),('bbb'),('ggg');
Query OK, 1 row affected (0.00 sec)
Records: 8  Duplicates: 7  Warnings: 0

mysql> select * from mytable;
+----+------+
| id | name |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
|  3 | ccc  |
|  4 | ddd  |
|  5 | eee  |
|  6 | fff  |
|  7 | ggg  |
+----+------+
7 rows in set (0.00 sec)


Аналогично при вставке из файла:
C:\>type test.txt
aaaa
bbbb
bbbb
cccc
dddd
bbbb
aaaa
eeee

mysql> create table mytable(id bigint auto_increment primary key,name varchar(32) unique);
Query OK, 0 rows affected (0.00 sec)

mysql> load data local infile 'c:\\test.txt' ignore into table mytable(name);
Query OK, 5 rows affected (0.00 sec)
Records: 8  Deleted: 0  Skipped: 3  Warnings: 0

mysql> select * from mytable;
+----+------+
| id | name |
+----+------+
|  1 | aaaa |
|  2 | bbbb |
|  3 | cccc |
|  4 | dddd |
|  5 | eeee |
+----+------+
5 rows in set (0.00 sec)


Какая у вас версия MySQL и как конкретно вы вставляете?
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
FanatPHP
@FanatPHP
Чебуратор тега РНР
Как и многие начинающие, ты путаешь понятия "уникальный" и "красивенький по порядку".
Ответ написан
Комментировать
Writerim
@Writerim
Заполнить позже...
У вас autoincrement меняется. уникальные\не уникальные записи сдвигают его. А на каком "AUTO INCREMENT" срабатывает правило UNIQUE то на таком и запишется

b90aaff54ed64d77a7b38dd02af9d31c.png3d922d52d3f34c138f000ed0dae38b65.png26349a47d5ce41799b67a808b004783a.png

Таблица test

Как вариант можно использовать TEMPORARY TABLE для записи в нее с правильным порядком и затем перенести из нее обратно

9ed1f7c5adbe4cee80956c061367f282.png
Ответ написан
mgyk
@mgyk
Вставка множества записей через VALUES меняет автоинкремент

mysql> SELECT AUTO_INCREMENT FROM information_schema.tables where table_schema = DATABASE() and table_name = 'test3';
+----------------+
| AUTO_INCREMENT |
+----------------+
|             16 |
+----------------+
1 row in set (0.00 sec)

mysql> insert ignore into test3(name) VALUES ('xxx'),('aaa'),('fff');
Query OK, 0 rows affected (0.00 sec)
Records: 3  Duplicates: 3  Warnings: 0

mysql> SELECT AUTO_INCREMENT FROM information_schema.tables where table_schema = DATABASE() and table_name = 'test3';
+----------------+
| AUTO_INCREMENT |
+----------------+
|             19 |
+----------------+
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы