MySQLで複数カラムを同時にUPDATEする方法|効率よくデータ更新

データベース・SQL

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で対象を確認
  • 重要な更新にはトランザクションを使用
  • インデックスの活用でパフォーマンス向上
  • 大量データは分割して処理

コメント

タイトルとURLをコピーしました