🐬

MySQL:CSVのインポートSQLをループで実行するとIDが不連続になる

に公開

pythonで以下のように、フォルダ内の複数のcsvファイルをimportする場合に、IDが飛ぶ場合がありました。テーブルのENGINEは、innoDBです。

# 1. インポート対象のファイルとテーブルをリストで定義
import_map = [
    ('users.csv', 'users_table'),
    ('products.csv', 'products_table'),
    ('orders.csv', 'orders_table'),
]

# 2. CSVファイルが格納されているディレクトリ
csv_dir = './csv_data' 

# 3. リストをループして1件ずつ処理
for csv_file, table_name in import_map:
    try:
        # ファイルのフルパスを生成
        file_path = os.path.join(csv_dir, csv_file).replace('\\', '/')

        print(f"処理中: {file_path} -> {table_name}")

        # LOAD DATA LOCAL INFILE クエリを生成
        # IGNORE 1 LINES はCSVのヘッダー行を読み飛ばす設定
        query = f"""
            LOAD DATA LOCAL INFILE '{file_path}'
            INTO TABLE `{table_name}`
            FIELDS TERMINATED BY ','
            LINES TERMINATED BY '\n'
            IGNORE 1 LINES
        """

        # クエリを実行
        # cursor.execute(query) # 実際のコードではこの行のコメントを外す

        # 成功メッセージ
        print(f"-> 成功: '{csv_file}' を '{table_name}' にインポートしました。")

    except Exception as e:
        # エラーが発生した場合はメッセージを表示して次のファイルへ
        print(f"-> エラー: '{csv_file}' のインポートに失敗しました。理由: {e}")
        continue

この状況を解消するには、以下の設定を、my.iniに記載して再起動したら直りました。
または、テーブルのENGINEをMyISAMの場合も連続になりました。

innodb_autoinc_lock_mode=0

Discussion