MySQL Авто Приращения Значений После УДАЛЕНИЯ без ГДЕ - PullRequest
3 голосов
/ 13 сентября 2009

заметил после бега,

DELETE FROM tablename

Мои ID (автоинкрементные) значения стали странными

7, 8, 9, 0, 1, 12, 3, 4, 15 

В этом порядке, когда я делаю,

SELECT * FROM tablename

Я знаю, что в руководстве по сертификации сказано, что идентификаторы могут или не могут быть сброшены, когда DELETE без WHERE используется для очистки таблицы, но что вызвало такую ​​странную последовательность ID? Я совершенно уверен, что это порядок, в котором были вставлены строки. Первоначально до удаления у меня было 6 строк в таблице, поэтому 7, 8, 9 кажутся понятными.

Ответы [ 4 ]

3 голосов
/ 13 сентября 2009

Абсолютно нет единства или гарантии порядка в базе данных без условия order by. Это связано с тем, как хранятся записи - они не хранятся в последовательности чего-либо. База данных часто оптимизирует способ хранения данных на основе кластеризованных индексов, но каждая база данных хранит данные немного по-своему.

Вы никогда не должны думать, что у вас будет повторяющийся заказ , если только не используется выражение order by.

Итак, похоже, что ваши идентификаторы были восстановлены. В этом порядке нет абсолютно ничего странного - вы изначально выбрали псевдослучайный порядок.

2 голосов
/ 15 сентября 2009

по отношению к вашим снимкам экрана: http://img19.imageshack.us/img19/7336/82051321.png и http://img27.imageshack.us/img27/2935/24285862.png

проблема с вашим "кодом приложения". вы используете LOAD DATA INFILE с файлом, который имеет окончания строк в стиле Windows (\ r \ n), а по умолчанию в mysql, если не указано иное, используется стиль unix (\ n).

чтобы понять, что я имею в виду, попробуйте это:

mysql> load data infile 'data.txt' into table testDel (val);
Query OK, 6 rows affected (0.01 sec)
Records: 6  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from testDel;
+----+----------------+
| id | val            |
+----+----------------+
 | 7 | hello world 1
 | 8 | hello world 2
 | 9 | hello world 3
 | 0 | hello world 4
 | 1 | hello world 5
| 12 | hello world 6  |
+----+----------------+
6 rows in set (0.00 sec)

mysql> select id, hex(val) from testDel;
+----+------------------------------+
| id | hex(val)                     |
+----+------------------------------+
|  7 | 68656C6C6F20776F726C6420310D |
|  8 | 68656C6C6F20776F726C6420320D |
|  9 | 68656C6C6F20776F726C6420330D |
| 10 | 68656C6C6F20776F726C6420340D |
| 11 | 68656C6C6F20776F726C6420350D |
| 12 | 68656C6C6F20776F726C642036   |
+----+------------------------------+
6 rows in set (0.01 sec)

То, что происходит, - это то, что \ n загромождает отображение ваших значений. Вы заметили, как "стены" ваших столов не совпадают? это должен быть намек на то, что с дисплеем что-то не так, о чем свидетельствует запрос с шестнадцатеричным (val), где «стены» выстраиваются в линию.

Чтобы исправить импорт, вы должны указать окончания строк в файле:

mysql> load data infile 'data.txt' into table testDel lines terminated by '\r\n' (val);
Query OK, 6 rows affected (0.00 sec)
Records: 6  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from testDel;
+----+---------------+
| id | val           |
+----+---------------+
| 13 | hello world 1 |
| 14 | hello world 2 |
| 15 | hello world 3 |
| 16 | hello world 4 |
| 17 | hello world 5 |
| 18 | hello world 6 |
+----+---------------+
6 rows in set (0.00 sec)
1 голос
/ 13 сентября 2009

Вместо DELETE FROM вы должны попробовать

TRUNCATE tablename

Я считаю, что это также сбросит последовательность для идентификатора.

0 голосов
/ 14 сентября 2009

здесь что-то происходит, кроме просто УДАЛИТЬ, затем 10 простых ВСТАВК, затем простой ВЫБОР. у вас есть 0 в вашем списке идентификаторов, что означает, что что-то где-то указывает значения для вашего столбца auto_increment.

Я бы проверил код вашего приложения.

Если это не так, вам нужно придумать определенный набор шагов (включая CREATE TABLE), который показывает, как эту проблему можно воспроизвести.

...