効率的なデータインポート:MySQLで複数行を挿入する4つの方法

2024-04-02

MySQLで複数の行を挿入する方法

方法1:VALUES句を複数回使用

最も基本的な方法は、INSERTステートメントのVALUES句を複数回使用する方法です。

INSERT INTO テーブル名 (列名1, 列名2, ...)
VALUES (値1, 値2, ...),
       (値3, 値4, ...),
       ...;

INSERT INTO employees (name, department, salary)
VALUES ('山田太郎', '営業', 300000),
       ('佐藤花子', '開発', 400000),
       ('田中一郎', '人事', 250000);

方法2:LOAD DATA INFILE

CSVファイルなどの外部ファイルからデータをインポートする場合は、LOAD DATA INFILEステートメントを使用できます。

LOAD DATA INFILE 'ファイルパス'
INTO TABLE テーブル名
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(列名1, 列名2, ...);
LOAD DATA INFILE '/data/employees.csv'
INTO TABLE employees
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(name, department, salary);

方法3:INSERT INTO ... SELECT

別のテーブルからデータをコピーする場合は、INSERT INTO ... SELECT構文を使用できます。

INSERT INTO テーブル名 (列名1, 列名2, ...)
SELECT 列名1, 列名2, ...
FROM 別のテーブル名;
INSERT INTO customers (name, email, address)
SELECT name, email, address
FROM orders;

方法4:繰り返し処理

少量のデータを挿入する場合は、ループ処理を使用してINSERTステートメントを実行することもできます。

# Pythonの例

for data in employees_data:
    sql = "INSERT INTO employees (name, department, salary) VALUES (%s, %s, %s)"
    cursor.execute(sql, data)

# Javaの例

for (String name, String department, int salary) : employeesData) {
    String sql = "INSERT INTO employees (name, department, salary) VALUES (?, ?, ?)";
    try (PreparedStatement statement = connection.prepareStatement(sql)) {
        statement.setString(1, name);
        statement.setString(2, department);
        statement.setInt(3, salary);
        statement.executeUpdate();
    }
}



# Pythonの例

import mysql.connector

# データベースへの接続
connection = mysql.connector.connect(
    host="localhost",
    user="root",
    password="password",
    database="mydb"
)

# 挿入するデータ
employees_data = [
    ("山田太郎", "営業", 300000),
    ("佐藤花子", "開発", 400000),
    ("田中一郎", "人事", 250000),
]

# カーソルの取得
cursor = connection.cursor()

# 複数行挿入
for data in employees_data:
    sql = "INSERT INTO employees (name, department, salary) VALUES (%s, %s, %s)"
    cursor.execute(sql, data)

# コミット
connection.commit()

# カーソルと接続を閉じる
cursor.close()
connection.close()
  1. mysql.connectorモジュールをインポートします。
  2. データベースへの接続を確立します。
  3. 挿入するデータのリストを用意します。
  4. カーソルを取得します。
  5. ループ処理を使用して、INSERTステートメントを実行します。
  6. コミットして変更を保存します。
  7. カーソルと接続を閉じます。



この方法は、INSERT ... SELECT構文にON DUPLICATE KEY UPDATE句を追加することで、既存のレコードを更新することができます。

INSERT INTO テーブル名 (列名1, 列名2, ...)
SELECT 列名1, 列名2, ...
FROM 別のテーブル名
ON DUPLICATE KEY UPDATE 列名1 =1, 列名2 =2, ...;
INSERT INTO customers (name, email, address)
SELECT name, email, address
FROM orders
ON DUPLICATE KEY UPDATE email = VALUES(email), address = VALUES(address);

この例では、ordersテーブルからcustomersテーブルにデータをコピーします。name列が重複する場合は、email列とaddress列を更新します。

REPLACE INTO

この方法は、INSERTステートメントの代わりにREPLACE INTOステートメントを使用することで、既存のレコードを置き換えることができます。

REPLACE INTO テーブル名 (列名1, 列名2, ...)
VALUES (値1, 値2, ...),
       (値3, 値4, ...),
       ...;
REPLACE INTO employees (name, department, salary)
VALUES ('山田太郎', '営業', 300000),
       ('佐藤花子', '開発', 400000),
       ('田中一郎', '人事', 250000);

この例では、employeesテーブルの既存のレコードを、指定された新しいレコードに置き換えます。

Stored Procedure

この方法は、ストアドプロシージャを作成して、複数の行を挿入することができます。

DELIMITER //

CREATE PROCEDURE insert_employees (
    IN name VARCHAR(255),
    IN department VARCHAR(255),
    IN salary INT
)
BEGIN
    INSERT INTO employees (name, department, salary)
    VALUES (name, department, salary);
END //

DELIMITER ;

CALL insert_employees('山田太郎', '営業', 300000);
CALL insert_employees('佐藤花子', '開発', 400000);
CALL insert_employees('田中一郎', '人事', 250000);

この例では、insert_employeesというストアドプロシージャを作成して、3人の従業員のデータを挿入します。

これらの方法は、それぞれ異なる利点と欠点があります。状況に応じて最適な方法を選択してください。


mysql sql-insert


大文字小文字・アクセント記号に注意!utf8_general_ciとutf8_unicode_ciの比較

MySQLデータベースでは、文字列の比較や照合順序を定義するために「照合順序」と呼ばれる設定を使用します。utf8_general_ciとutf8_unicode_ciは、どちらもUTF-8文字エンコーディングを使用する照合順序ですが、文字の比較方法に違いがあります。...


SQL初心者でも安心!ステップバイステップでわかるWHERE句の多重条件検索

構文説明SELECT 句:抽出したい列を指定します。FROM 句:検索対象のテーブルを指定します。WHERE 句:レコードを絞り込む条件を指定します。AND キーワード:複数の条件を組み合わせるために使用します。例社員テーブル (employees) において、部署が「営業」で、かつ入社年が2020年以降の社員をすべて抽出するクエリは以下のようになります。...


PDO、MySQL固有関数、エラーメッセージ、拡張機能、情報スキーマ:MariaDBとMySQLを判別する多様な手法

PDO ドライバを使用するPDO (PHP Data Objects) は、データベースとの接続と操作を簡潔に行うための拡張機能です。PDO ドライバを使用すると、データベースの種類に関係なく、同じコードでデータベースに接続できます。このコードでは、PDO::ATTR_DRIVER_NAME 属性を使用して、接続しているデータベースの種類を取得しています。...


コマンド1つで簡単削除!CentOS 7/RHEL 7からMariaDB/MySQLをサクッとアンインストールする方法

必要なもの:CentOS 7 または RHEL 7 サーバーroot ユーザーへのアクセス手順:サービスの停止:データベースの削除:設定ファイルの削除:パッケージの削除:MariaDB の場合:注意:上記の手順は、CentOS 7 または RHEL 7 サーバーで MariaDB または MySQL を完全に削除するための一般的なガイドラインです。...


レベルアップを目指せ!MySQL、phpMyAdmin、MariaDBでユーザーアカウントを操作するための高度なテクニック

権限エラー:最も一般的なエラーの一つは、権限不足によるものです。ユーザーアカウントに十分な権限がない場合、アカウントを作成したり、更新したりすることができません。この問題を解決するには、以下のいずれかの方法を実行します。rootユーザーとしてphpMyAdminにログイン: rootユーザーは、MySQLサーバー上のすべての権限を持ちます。...


SQL SQL SQL Amazon で見る



VALUES句 vs INSERT ALL vs FORALL:どれを選ぶべきか?

Oracleデータベースで複数の行を挿入するには、いくつかの方法があります。それぞれに長所と短所があり、状況に応じて最適な方法を選択する必要があります。方法VALUES句を使用するメリットシンプルで分かりやすい少数の行を挿入する場合に効率的