既存の製品テーブルを独自の新しいテーブルにインポートしています。作成したインポート スクリプトは完全に実行され、適切な量の行 (6000 程度) が挿入されます。ただし、インポート後、次の自動インクリメントされた主キー/ID は、テーブル内の行数を 1500 エントリ (またはその程度) 上回っています。
なぜ MySQL がこれを行っているのか理解できず、停止したいと考えています。助けを求めてオンラインで通常の検索を行いましたが、空白を描いています - 何かアイデアはありますか?
既存の製品テーブルを独自の新しいテーブルにインポートしています。作成したインポート スクリプトは完全に実行され、適切な量の行 (6000 程度) が挿入されます。ただし、インポート後、次の自動インクリメントされた主キー/ID は、テーブル内の行数を 1500 エントリ (またはその程度) 上回っています。
なぜ MySQL がこれを行っているのか理解できず、停止したいと考えています。助けを求めてオンラインで通常の検索を行いましたが、空白を描いています - 何かアイデアはありますか?
たとえば、次の単純な表を見てみましょう。
CREATE TABLE `products` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(64) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;
そして、次のようなファイルをインポートします。
"id","name"
1,"product 1"
2,"product 2"
5,"product 3"
102,"product 4"
次に、両方の列にデータをインポートしているため、自動増分メカニズムは機能しません。すべての行をインポートした後、次の自動インクリメント ID が一意になるように、テーブルの自動インクリメント値がMAX(id)+1 [この場合は103 ] に設定されます。挿入された行数と等しい場合、次の autincrement 値は 5 になり、行 #3 と衝突します。
クリーンな開始 ID と最終 ID を行数に等しくしたい場合は、.csvファイルから "id" 列を削除するか、idのAUTO_INCREMENT なしでテーブルを作成し、データをインポートして次の単純な SQL を実行する必要があります。
SET @i=0;
UPDATE `products` SET id=@i:=@i+1 ORDER BY id;
ALTER TABLE `products` CHANGE COLUMN `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT FIRST;
最初のクエリは、レコードを更新する前にインクリメントされる補助変数を設定します。2 つ目は、行番号と同じ ID を持つようにレコードを更新します。3 番目は、id 列を自動インクリメントに変更し、次の自動インデックスに適切な値を設定します。
ただし、主キーを変更する前に、それらが他のテーブルで外部キーとして使用されていないことを確認してください。
このコマンドを実行する場合:
show create table Foo
次に、AUTO_INCREMENT=
が設定されているものも表示されます。
私の推測では、0で始まるように設定されていません。
次に、AUTO_INCREMENTを0(または1、頭のてっぺんから思い出せない)に設定する新しいテーブルを作成する必要があります。これでうまくいくはずです。