効率的なデータインポート:MySQLで複数行を挿入する4つの方法
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()
mysql.connector
モジュールをインポートします。- データベースへの接続を確立します。
- 挿入するデータのリストを用意します。
- カーソルを取得します。
- ループ処理を使用して、
INSERT
ステートメントを実行します。 - コミットして変更を保存します。
- カーソルと接続を閉じます。
この方法は、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