在没有WHERE的DELETE之后的MySQL自动递增值

时间:2009-09-13 13:24:50

标签: mysql auto-increment sql-delete

跑完后我注意到了,

DELETE FROM tablename

我的ID(自动增量)值变得很奇怪

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

当我这样做时,按此顺序

SELECT * FROM tablename

我知道认证指南说当没有WHERE的DELETE用于清空表时,ID可能会重置也可能不会重置,但是导致ID序列如此奇怪的原因是什么?我很确定这是插入行的顺序。最初在删除之前,我在表中有6行,所以7,8,9似乎是可以理解的。

4 个答案:

答案 0 :(得分:3)

没有order by子句的数据库中绝对没有顺序或保证顺序。这与记录的存储方式有关 - 它们不是按任何顺序存储的。数据库通常根据聚簇索引优化存储数据的方式,但每个数据库存储的数据略有不同。

除非使用order by条款,否则您永远不会认为您将拥有可重复的订单

因此,您的ID似乎已被回收。关于那个顺序绝对没什么奇怪的 - 你基本上首先选择了伪随机排序。

答案 1 :(得分:2)

参考您的屏幕截图:http://img19.imageshack.us/img19/7336/82051321.pnghttp://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)

正在发生的事情是\ r是破坏你的价值观的显示。你有没有注意到你的桌子“墙”是如何排列的?这应该是显示器出现问题的暗示,正如“hex”(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)

答案 2 :(得分:1)

而不是DELETE FROM,你应该尝试

TRUNCATE tablename

我相信这也会重置ID的序列。

答案 3 :(得分:0)

这里除了DELETE之外还有一些东西,然后是10个简单的INSERT,然后是一个简单的SELECT。你的ID列表中有一个0,这意味着某个地方正在为你的auto_increment列指定值。

我会检查您的应用程序代码。

如果不是这样,你需要提出一组特定的步骤(包括一个CREATE TABLE)来说明如何重现这个问题。