0

既存の製品テーブルを独自の新しいテーブルにインポートしています。作成したインポート スクリプトは完全に実行され、適切な量の行 (6000 程度) が挿入されます。ただし、インポート後、次の自動インクリメントされた主キー/ID は、テーブル内の行数を 1500 エントリ (またはその程度) 上回っています。

なぜ MySQL がこれを行っているのか理解できず、停止したいと考えています。助けを求めてオンラインで通常の検索を行いましたが、空白を描いています - 何かアイデアはありますか?

4

2 に答える 2

1

たとえば、次の単純な表を見てみましょう。

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 列を自動インクリメントに変更し、次の自動インデックスに適切な値を設定します。

ただし、主キーを変更する前に、それらが他のテーブルで外部キーとして使用されていないことを確認してください。

于 2010-09-06T15:06:12.590 に答える
0

このコマンドを実行する場合:

show create table Foo

次に、AUTO_INCREMENT=が設定されているものも表示されます。
私の推測では、0で始まるように設定されていません。

次に、AUTO_INCREMENTを0(または1、頭のてっぺんから思い出せない)に設定する新しいテーブルを作成する必要があります。これでうまくいくはずです。

于 2010-09-06T11:24:06.113 に答える