3

跑步后发现,

DELETE FROM tablename

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

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

按照这个顺序,当我做一个时,

SELECT * FROM tablename

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

4

4 回答 4

3

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

除非您使用该order by子句,否则您永远不应该认为您将拥有可重复的订单。

因此,您的 ID 似乎已被回收。这个顺序绝对没有什么奇怪的——你基本上首先选择了一个伪随机顺序。

于 2009-09-13T13:30:18.633 回答
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)
于 2009-09-15T14:15:31.270 回答
1

而不是 DELETE FROM 你应该尝试

TRUNCATE tablename

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

于 2009-09-13T13:28:49.387 回答
0

除了 DELETE、10 个简单的 INSERT 和一个简单的 SELECT 之外,这里还发生了一些事情。您的 ID 列表中有一个 0,这意味着某处正在为您的 auto_increment 列指定值。

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

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

于 2009-09-14T14:22:30.857 回答