MySQL 入門

MySQL INSERT INTO 文

INSERT INTO 文は、既存のテーブルに新しいデータ行(レコード)を追加するための基礎的なコマンドです。最も明確な形式では、値を入力するカラムを正確に定義し、対応するデータを提供することで、データベースエンジンがデータをどこに配置すべきかを正確に認識できるようにします。

1. カラム指定による挿入

標準的な構文では、テーブル名、入力するカラム名のリスト、および具体的なデータ値を指定する必要があります。カラムを明示的にリストアップすることで、データの挿入順序を正確にコントロールでき、将来的なテーブル構造(スキーマ)の変更に対しても堅牢なコードになります。

-- 'customers'(顧客)テーブルに新しいレコードを1件挿入
INSERT INTO customers (first_name, last_name, email, created_at)
VALUES ('Jane', 'Doe', '[email protected]', '2023-10-27 10:00:00');

この例では、データベースが 'Jane'first_name に、'Doe'last_name にといった具合にマッピングします。提供する値の数は、指定したカラムの数と一致していなければなりません。もし NULL 値を許容しているカラムや、デフォルト(Default)値が定義されているカラムを省略した場合、データベースはそれらを自動的に処理します。

2. カラム名を指定しない位置ベースの挿入

テーブル内のすべてのカラムに値を挿入し、かつテーブル作成時に定義された順序を厳密に守る場合は、カラム名のリストを省略することができます。

-- 'employees'(従業員)テーブルのすべてのカラムに順序通りデータを挿入
INSERT INTO employees VALUES (101, 'Robert', 'Smith', 'IT', 75000);

この方法は構文上は正しいですが、プロフェッショナルな開発環境では通常「アンチパターン(避けるべき手法)」とみなされます。万が一、データベース管理者が新しいカラムを追加したり、カラムの物理的な順序を変更したりといったスキーマ変更が行われた場合、このクエリは即座にエラーになるか、最悪の場合、誤ったカラムにデータが静かに挿入(サイレントインサート)されてしまうリスクがあるからです。常に前節のような「カラム名を明示的に指定する方法」を優先してください。

3. 特殊な値とデフォルト値のハンドリング

データベーステーブルには通常、デフォルト値を持つカラム(例:アカウント作成時に自動生成されるタイムスタンプ)や、オプションフィールド用の NULL 値が含まれます。これらを処理するには主に2つの方法があります。

  • 明示的な指定: VALUES リストの中に明示的に DEFAULT キーワードや NULL を記述します。
  • 暗黙的な省略: カラムに DEFAULT 制約がある場合(または NULL を許容する場合)、INSERT 文からそのカラムを完全に省略すれば、データベースが自動的にデフォルト値を適用、または空値を入力します。
-- 'status' フィールドのデフォルトが 'active' で、'bio' フィールドが NULL を許容すると仮定
INSERT INTO users (username, password_hash)
VALUES ('jdoe_dev', 'secret_hash_123');

データベースエンジンは、データをディスクに正式にコミット(書き込み)する前に、プライマリキー(Primary Keys)の一意性や NOT NULL(非空)要件などのデータ整合性制約が完全に満たされていることを確認するため、特定の内部プロセスに従ってこれらの操作を実行します。

3.1 挿入操作の内部実行ロジック:

  1. INSERT ステートメントの開始
  2. 制約チェック (Check Constraints)
    • プライマリキーの衝突 (Primary Key Conflict) または NOT NULL 値の欠落 (NOT NULL Missing) が発生 → その行を拒否 (Reject Row) し、エラーを返す。
  3. 有効なデータの場合 (Valid Data) → データを準備 (Prepare Data)。
  4. テーブルへの書き込み (Write to Table)
  5. インデックスの更新 (Update Indexes)
  6. 成功の確定 (Confirm Success)