PostgreSQL 入門

PostgreSQL におけるデータ挿入

データテーブルにデータを挿入することは、データベース管理における最も基本的な操作の一つであり、実際の情報でテーブルを埋めるためのステップです。PostgreSQLでは、INSERT文がこのタスクを遂行するための主要なツールとなります。

本セクションでは、PostgreSQLでデータを挿入する際の構文フォーマットや、様々な実用的なオプションについて包括的に解説します。

1. 基本的なINSERT文

INSERT文の最もシンプルな形式は、テーブルに新しい1行のデータを挿入することです。テーブル名を指定し、各カラムに対応する値を提供する必要があります。

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
  • table_name: データを挿入したいターゲットテーブルの名称。
  • (column1, column2, ...): (オプション)カラム名のリスト。データを挿入したい特定のカラムとその順序を指定します。このリストを省略する場合、テーブル作成時に定義されたカラムの順序に従って、すべてのカラムに値を提供する必要があります。
  • VALUES (value1, value2, ...): 対応するカラムに挿入する具体的な値のリスト。

例:

次のような employees(従業員)テーブルを作成したと仮定します。

CREATE TABLE employees (
    employee_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    email VARCHAR(100),
    hire_date DATE,
    salary DECIMAL(10, 2)
);

employees テーブルに新しい従業員を挿入するには、以下のINSERT文を使用します。

INSERT INTO employees (first_name, last_name, email, hire_date, salary)
VALUES ('ジョン', 'ドゥ', '[email protected]', '2023-01-15', 60000.00);

この例では、データを挿入するカラムを明示的に指定しています。employee_id カラムは SERIAL型(一意の連番を自動生成)であるため、値を指定する必要はなく、PostgreSQLがバックグラウンドで自動的に処理します。

1.1 カラムリストの省略

テーブル定義の順序に従ってすべてのカラムに値を挿入する場合、カラムリストを省略できます。

INSERT INTO employees
VALUES (DEFAULT, 'ジェーン', 'スミス', '[email protected]', '2023-02-20', 65000.00);

ここでは、employee_id カラムに DEFAULT キーワードを使用し、PostgreSQLに次のシーケンス値を生成させています。非常に重要な点として、VALUES句内の値の順序は、テーブルで定義されたカラムの順序と完全に一致している必要があります。

2. 特定のカラムへのデータ挿入

テーブル内の一部のカラム(サブセット)のみにデータを挿入することも可能です。明示的に指定されなかったカラムには、デフォルト値(定義されている場合)が割り当てられるか、NULL(デフォルト値がなく、NULLが許可されている場合)が設定されます。

例:

新しい従業員を挿入し、今回は名前、名字、メールアドレスのみを提供します。

INSERT INTO employees (first_name, last_name, email)
VALUES ('マイク', 'ブラウン', '[email protected]');

この場合、hire_date(入社日)と salary(給与)カラムは、テーブル作成時にデフォルト値が設定されていないため NULL に設定されますが、employee_id は依然として自動生成されます。

3. 複数行の一括挿入(マルチ行インサート)

PostgreSQLでは、単一のINSERT文を使用して複数行のデータを同時に挿入することができます。これは、特に大規模なデータセットを扱う際の実行効率を大幅に向上させます。

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1_1, value1_2, value1_3, ...),
       (value2_1, value2_2, value2_3, ...),
       (value3_1, value3_2, value3_3, ...);

例:

一度に3人の新入社員を挿入してみましょう。

INSERT INTO employees (first_name, last_name, email, hire_date, salary)
VALUES ('アリス', 'ジョンソン', '[email protected]', '2023-03-01', 70000.00),
       ('ボブ', 'ウィリアムズ', '[email protected]', '2023-03-15', 72000.00),
       ('チャーリー', 'デイビス', '[email protected]', '2023-04-01', 75000.00);

これは、独立した3つのINSERT文を実行するよりもはるかに高速です。

4. SELECT文を使用したデータ挿入

SELECT文を使用して別のテーブル(あるいは同じテーブル)からデータを抽出し、それを直接ターゲットテーブルに挿入することができます。データのコピーや、挿入前のデータ変換に非常に有用です。

INSERT INTO table_name (column1, column2, column3, ...)
SELECT column_a, column_b, column_c
FROM another_table
WHERE condition;
  • table_name: データを挿入するターゲットテーブル。
  • (column1, ...): ターゲットテーブル内の埋められるカラム。
  • SELECT ... FROM ... WHERE: another_table(別のテーブル)からデータを取得します。選択されたカラムの数とデータ型は、INSERT文で指定されたカラムの数と型に一致している必要があります。WHERE句はオプションで、挿入するデータをフィルタリングするために使用します。

例:

構造は似ているが古い情報が含まれている old_employees というテーブルがあるとします。2020年以前に入社した従業員を現在の employees テーブルに移行したい場合:

INSERT INTO employees (first_name, last_name, email, hire_date, salary)
SELECT first_name, last_name, email, hire_date, salary
FROM old_employees
WHERE hire_date < '2020-01-01';

5. SERIAL型カラムとデフォルト値の扱い

前述の例にあるように、SERIAL型のカラムは一意の自増整数シーケンスを自動生成します。データを挿入する際、これらのカラムを扱う方法は主に2つあります。

-- 方法 1:カラムリストから直接省略する
INSERT INTO employees (first_name, last_name)
VALUES ('イヴ', 'テイラー');

-- 方法 2:DEFAULT キーワードを使用する
INSERT INTO employees (employee_id, first_name, last_name)
VALUES (DEFAULT, 'フランク', 'ミラー');

特定のカラムにデフォルト値が定義されており、挿入時に特定の値を指定したくない場合も、同様に DEFAULT キーワードを使用できます。

CREATE TABLE products (
    product_id SERIAL PRIMARY KEY,
    product_name VARCHAR(100) NOT NULL,
    price DECIMAL(10, 2) DEFAULT 0.00
);

INSERT INTO products (product_name)
VALUES ('スーパーガジェット');
-- または明示的に記述:
-- VALUES ('スーパーガジェット', DEFAULT);

この例では、新しく挿入された製品の price(価格)は自動的にデフォルト値の 0.00 に設定されます。

6. データ型に関する注意点

データを挿入する際、提供する値のデータ型がテーブルの対応するカラムのデータ型と一致していることを確認することは極めて重要です。PostgreSQLは暗黙的な型変換(Implicit Casting)を試みますが、予期しない動作やエラーを避けるために、明示的で標準的な記述を推奨します。

  • 文字列 (Strings): 文字列は必ずシングルクォートで囲む必要があります(例:'ジョン')。
  • 数値 (Numbers): 数値リテラルを直接記述し、引用符を付けないでください(例:60000.00)。
  • 日付 (Dates): 標準的な日付フォーマット文字列を使用します(例:'2023-01-15')。複雑な日付フォーマットの場合、TO_DATE() 関数が必要になることがあります。
  • ブーリアン (Booleans): TRUE または FALSE を直接使用します(引用符は不要)。

明示的な日付変換の例:

日付フォーマットが MM/DD/YYYY(月/日/年)の場合、TO_DATE() 関数を使用して変換できます。

INSERT INTO employees (first_name, last_name, hire_date)
VALUES ('グレース', 'アンダーソン', TO_DATE('05/20/2023', 'MM/DD/YYYY'));

7. よくあるエラーとトラブルシューティング

  • データ型の不一致 (Data type mismatch): 挿入する値の型が対応するカラムの型と一致しているか確認してください。
  • 値の数が正しくない (Incorrect number of values): VALUES句内の値の数は、カラムリスト内のカラム数と完全に一致している必要があります(カラムリストを省略した場合は、テーブルの総カラム数と一致させる必要があります)。
  • 制約違反 (Violation of constraints): カラムに NOT NULL、UNIQUE、または FOREIGN KEY(外键)などの制約がある場合、挿入データがそれらの条件を満たしているか確認してください。例えば、UNIQUE制約のあるカラムに重複した値を挿入するとエラーが発生します。
  • 構文エラー (Syntax errors): SQL文にスペルミスがないか、括弧やカンマが漏れていないか注意深くチェックしてください。