跑完后我注意到了,
DELETE FROM tablename
我的ID(自动增量)值变得很奇怪
7, 8, 9, 0, 1, 12, 3, 4, 15
当我这样做时,按此顺序
SELECT * FROM tablename
我知道认证指南说当没有WHERE的DELETE用于清空表时,ID可能会重置也可能不会重置,但是导致ID序列如此奇怪的原因是什么?我很确定这是插入行的顺序。最初在删除之前,我在表中有6行,所以7,8,9似乎是可以理解的。
答案 0 :(得分:3)
没有order by
子句的数据库中绝对没有顺序或保证顺序。这与记录的存储方式有关 - 它们不是按任何顺序存储的。数据库通常根据聚簇索引优化存储数据的方式,但每个数据库存储的数据略有不同。
除非使用order by
条款,否则您永远不会认为您将拥有可重复的订单。
因此,您的ID似乎已被回收。关于那个顺序绝对没什么奇怪的 - 你基本上首先选择了伪随机排序。
答案 1 :(得分:2)
参考您的屏幕截图: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)
正在发生的事情是\ 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)来说明如何重现这个问题。