3

走って気づいた、

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

4 に答える 4

3

句のないデータベースには、順序の類似性や保証はまったくありませんorder by。これは、レコードの保存方法と関係があります。レコードは何の順序でも保存されません。データベースは、クラスター化されたインデックスに基づいてデータの格納方法を最適化することがよくありますが、データベースごとにデータの格納方法が少し異なります。

条項を使用しない限り、繰り返し可能な注文があると決して考えてはなりません。order by

したがって、IDが再利用されたようです。その順序についてはまったく奇妙なことはありません。基本的に、最初に疑似ランダム順序を選択しました。

于 2009-09-13T13:30:18.633 に答える
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)
于 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 に答える