MySQL UPDATE 文
UPDATE 文は、既存のデータテーブルの行(レコード)に含まれる1つ以上のカラムの値を変更するための基礎的なコマンドです。新しいデータを作成する INSERT 文とは異なり、UPDATE 文の役割は、すでにデータベースに格納されている内容を変換し、最新の状態に更新することにあります。
1. UPDATE 文の構造
標準的な UPDATE 操作には、3つの主要なコンポーネントが必要です:ターゲットとなるテーブル、カラムの新しい値、そして「どの行を変更すべきか」を識別するためのフィルタ(フィルタリング条件)です。
UPDATE table_name
SET column1 = value1, column2 = value2
WHERE condition;- table_name (テーブル名): 変更したいデータが含まれているテーブルを指定します。
- SET (セット): この句では、更新するカラムとそれらに割り当てる新しい値を定義します。カンマで区切ることで、複数のカラムを同時に更新することが可能です。
- WHERE (条件フィルタ): 更新操作を特定の行に限定するためのフィルタです。もし WHERE 句を省略した場合、テーブル内のすべての行が更新されます。 これはデータベース管理において極めて重要なセキュリティ上の注意点です。
2. 単一レコードの更新
従業員の詳細情報を追跡する employees(従業員)テーブルを例に考えてみましょう。employee_id が 101 の従業員が昇進し、部署が変更されたと仮定します。
UPDATE employees
SET job_title = 'Senior Developer', -- 役職をシニアデベロッパーに更新
department_id = 5 -- 部署IDを5に更新
WHERE employee_id = 101; -- 特定の従業員をピンポイントで特定このステートメントは、一意のプライマリキーである employee_id = 101 を検索し、その特定のレコードに対してのみ変更を適用します。プライマリキーはユニーク(唯一)であるため、この操作が正確に1行のデータだけに影響することを完全に保証できます。
3. 複数レコードの更新
複数のレコードにマッチする条件を指定することで、一連の行に対して変更を適用できます。例えば、会社全体の年度ボーナスを適用したり、パフォーマンスの階層に基づいて給与を調整したりする場合です。
UPDATE employees
SET salary = salary * 1.10 -- 現在の給与を10%引き上げる
WHERE job_title = 'Junior Developer'; -- すべてのジュニアデベロッパーを対象とするこの例の salary = salary * 1.10 という式は、カラムの現在の値を使用して新しい値を計算できることを示しています。データベースは job_title が 'Junior Developer' である各レコードの現在の給与を取得し、それに 1.10 を掛けた結果を同じ行に保存し直します。
4. 安全な実行ワークフロー
更新操作は永続的なものであるため、更新コマンドを実行する前に選択基準(WHERE 句の条件)を検証することは、業界のベストプラクティスです。正しいレコードをターゲットにしているか確認するために、常に同じ WHERE 句を使用した SELECT 文を先に実行してください。
推奨される安全なワークフロー:
- ターゲット条件の定義: どのデータを更新する必要があるかを明確にします。
- 行を検証するための SELECT クエリの実行: まず
SELECT文で何が抽出されるかを確認します。 - 行は期待通りか?
- いいえ: ステップ1に戻り、WHERE 条件を調整します。
- はい: 次のステップへ進みます。
- UPDATE 文の実行: 実際の修正を適用します。
- 変更を確認するための SELECT の実行: 再度クエリを実行し、データが正しく更新されたか検証します。
5. 制約とデータ整合性の管理
更新操作も、テーブル作成時に定義された制約(Constraints)に従います。制約に違反する値に更新しようとした場合、例えば UNSIGNED(符号なし、つまり非負数)として定義されたカラムに負の数を設定しようとしたり、UNIQUE(ユニーク)カラムに重複する値を導入しようとしたりすると、MySQL はトランザクションを拒否し、エラーを返します。
また、外部キー(Foreign Key)制約を有効にしている場合、親テーブルの値を更新することで子テーブルに「孤児レコード(Orphan record)」が作成されるような操作は、あらかじめ ON UPDATE CASCADE(カスケード更新)動作を設定していない限り制限されます。