MySQLでデータベースの情報を更新するとき、1つずつカラムを変更するのは時間がかかりますよね。
この記事では、複数のカラムを一度に効率よく更新する方法について、基本的な書き方から応用テクニックまでわかりやすく解説します。
基本的な書き方

MySQLで複数のカラムを同時に更新するには、UPDATE文でSET句に複数のカラムと値をカンマで区切って書きます。
基本構文
UPDATE テーブル名
SET カラム1 = 値1,
カラム2 = 値2,
カラム3 = 値3
WHERE 条件;
ポイント
- SET句で複数のカラムと値をカンマ区切りで指定する
- WHERE句で更新したい行を絞り込む
- カラムの順番は自由に決められる
なぜ複数カラムを同時に更新するの?
1つずつ更新する場合と比べて、以下のメリットがあります:
- 処理速度が速い:データベースへのアクセス回数が減る
- データの整合性が保たれる:すべての変更が同時に実行される
- SQLの書き方がシンプル:コードが短くて読みやすい
実際の使用例
従業員情報を更新する例
従業員テーブル(employees)で、特定の従業員の給与、部署、状態を同時に更新してみましょう。
UPDATE employees
SET salary = 60000,
department = 'Marketing',
status = 'Active'
WHERE employee_id = 101;
この例の説明
employee_id
が101の従業員を対象にする- 給与を60000円に変更
- 部署をマーケティング部に変更
- 状態をアクティブに変更
- 3つの変更がすべて同時に実行される
商品テーブルを更新する例
商品の価格と在庫数を同時に更新する場合:
UPDATE products
SET price = 1200,
stock_quantity = 50,
last_updated = NOW()
WHERE product_id = 'P001';
この例のポイント
- 商品ID「P001」の情報を更新
- 価格を1200円に設定
- 在庫数を50個に設定
- 更新日時を現在時刻に自動設定
複数行を条件に応じて更新する方法

異なる条件で複数の行を一度に更新したい場合は、CASE文を使います。
CASE文を使った条件別更新
UPDATE employees
SET department = CASE
WHEN employee_id = 101 THEN 'Marketing'
WHEN employee_id = 102 THEN 'Sales'
WHEN employee_id = 103 THEN 'Engineering'
ELSE department
END,
status = 'Active'
WHERE employee_id IN (101, 102, 103);
CASE文の仕組み
WHEN 条件 THEN 値
で条件ごとに異なる値を設定ELSE department
で条件に当てはまらない場合は元の値を保持- すべての対象行のstatus は「Active」に統一
計算式を使った更新
給与を一定の割合で増加させる例:
UPDATE employees
SET salary = salary * 1.1,
bonus = salary * 0.1,
last_review = CURDATE()
WHERE department = 'Sales';
計算式の活用
- 現在の給与を1.1倍(10%アップ)
- ボーナスを新しい給与の10%に設定
- 査定日を今日の日付に更新
- 営業部の全員が対象
注意点とベストプラクティス

WHERE句は必ず確認する
UPDATE文でWHERE句を忘れると、テーブルのすべての行が更新されてしまいます。
-- 危険:WHERE句がないため全行が更新される
UPDATE employees
SET salary = 50000;
-- 安全:WHERE句で対象を絞る
UPDATE employees
SET salary = 50000
WHERE department = 'Intern';
更新前にSELECTで確認する
実際に更新する前に、どの行が対象になるかSELECT文で確認しましょう。
-- まずは対象行を確認
SELECT employee_id, name, salary, department
FROM employees
WHERE employee_id = 101;
-- 確認後に更新実行
UPDATE employees
SET salary = 60000,
department = 'Marketing'
WHERE employee_id = 101;
トランザクションを活用する
重要な更新の場合は、トランザクションを使って安全に実行しましょう。
START TRANSACTION;
UPDATE employees
SET salary = 65000,
department = 'Marketing',
status = 'Active'
WHERE employee_id = 101;
-- 結果を確認してから確定
SELECT * FROM employees WHERE employee_id = 101;
-- 問題なければ確定、問題があれば取り消し
COMMIT;
-- または ROLLBACK;
よくある使用パターン
パターン1:ステータス変更と日時更新
UPDATE orders
SET status = 'Shipped',
shipped_date = NOW(),
tracking_number = 'TN123456789'
WHERE order_id = 1001;
パターン2:集計結果での更新
UPDATE products p
SET total_sold = (
SELECT COALESCE(SUM(quantity), 0)
FROM order_items oi
WHERE oi.product_id = p.product_id
),
last_calculated = NOW()
WHERE p.category = 'Electronics';
パターン3:条件付き増減
UPDATE inventory
SET quantity = CASE
WHEN quantity > 10 THEN quantity - 5
WHEN quantity > 0 THEN quantity - 1
ELSE 0
END,
last_updated = NOW()
WHERE product_category = 'Seasonal';
パフォーマンスを向上させるコツ
インデックスを活用する
WHERE句で使用するカラムにインデックスを作成すると、更新速度が向上します。
-- employee_idにインデックスを作成
CREATE INDEX idx_employee_id ON employees(employee_id);
大量データの分割更新
大量のデータを更新する場合は、少しずつ分割して実行しましょう。
-- 1000件ずつ更新
UPDATE employees
SET status = 'Reviewed'
WHERE status = 'Pending'
LIMIT 1000;
まとめ
MySQLで複数カラムを同時に更新する方法について解説しました。
重要なポイント
- SET句でカンマ区切りに複数のカラムを指定
- WHERE句で対象行を正確に絞り込む
- CASE文で条件別の値変更が可能
- 更新前のSELECT確認とトランザクション活用が安全
実践のコツ
- 更新前は必ずSELECTで対象を確認
- 重要な更新にはトランザクションを使用
- インデックスの活用でパフォーマンス向上
- 大量データは分割して処理
コメント