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 挿入操作の内部実行ロジック:
- INSERT ステートメントの開始
- 制約チェック (Check Constraints)
- プライマリキーの衝突 (Primary Key Conflict) または
NOT NULL値の欠落 (NOT NULL Missing) が発生 → その行を拒否 (Reject Row) し、エラーを返す。 - 有効なデータの場合 (Valid Data) → データを準備 (Prepare Data)。
- テーブルへの書き込み (Write to Table)
- インデックスの更新 (Update Indexes)
- 成功の確定 (Confirm Success)