たまに全部のカラムを手動で埋めたくない時あるよね。まあ、めんどいし、そもそも必要なデータがない場合もあるし。そんな時は、あらかじめデフォルト値を設定しておけば、必要な時にDBが自動で入れてくれるんだ。
テーブルへの行の挿入
デフォルト値はテーブルへの行挿入とめっちゃ関係ある。だから今はサクッと説明して、あとでまた詳しくやるから安心して。
テーブルに行を追加するのは超カンタン。専用のコマンド INSERT INTO があるよ。INSERT INTO はSQLの構文で、新しい行をテーブルに追加するやつ。Webフォームやログ、ユーザー登録、データ更新とかでよく使う。
コマンドの構文
INSERT INTO テーブル (カラム1, カラム2, ...)
VALUES (値1, 値2, ...);
説明:
テーブル— データを追加するテーブル名。カラム1,カラム2, ... — カラムのリスト(全部のカラムに順番通り値を入れるなら省略OK)。値1,値2, ... — 指定したカラムに対応する値。
シンプルな例
INSERT INTO users (name, email)
VALUES ('Alice', 'alice@example.com');
users テーブルに1行追加されるよ:name — "Alice", email — "alice@example.com"。
結果:
| id | name | |
|---|---|---|
| 1 | Alice | alice@example.com |
複数行を一気に挿入する
複数レコードを1回のクエリで入れることもできる。こっちの方が速いし効率的!
INSERT INTO users (name, email)
VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.net'),
('Charlie', 'charlie@example.org'),
('Diana', 'diana@example.com'),
('Eve', 'eve@example.net');
結果はこんな感じ:
| id | name | |
|---|---|---|
| 1 | Alice | alice@example.com |
| 2 | Bob | bob@example.net |
| 3 | Charlie | charlie@example.org |
| 4 | Diana | diana@example.com |
| 5 | Eve | eve@example.net |
デフォルト値
行追加コマンドの構文、覚えてる?
INSERT INTO テーブル (カラム1, カラム2, ...)
VALUES (値1, 値2, ...);
なんでカラムのリスト カラム1, カラム2 があると思う?テーブルのカラム順に値を全部書けばいいじゃん、って思うよね。
実は、たくさんの値は省略できるんだ。例えば新しい行のIDはPostgreSQLが自動で決めてくれるし、追加日時も自動で入れてくれる。もし何も渡さなかったら、PostgreSQLはNULLを入れる。
PostgreSQLは色々便利なことを自動でやってくれる。そのコントロールができるのが デフォルト値 で、キーワード DEFAULT で設定するよ。
デフォルト値は、レコード追加時にそのカラムの値を指定しなかった場合に使われる。これで時間も節約できるし、大事な値をうっかり忘れるミスも防げる!
DEFAULT はどう動く?
構文を見てみよう。デフォルト値はテーブル作成時に設定する。基本の書き方はこれ:
CREATE TABLE テーブル (
カラム データ型 DEFAULT デフォルト値
);
既存テーブルにデフォルト値を追加したい場合は:
ALTER TABLE テーブル
ALTER COLUMN カラム
SET DEFAULT デフォルト値;
テーブル変更については、あと数回のレクチャーで詳しく話すね :P
例1: DEFAULT フィールド付きテーブル
students テーブルを作って、各学生が自動で登録日をもらうようにしてみよう:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
registration_date DATE DEFAULT CURRENT_DATE
);
これで新しい学生を registration_date なしで追加すると、PostgreSQLが自動で今日の日付を入れてくれる。
INSERT INTO students (name) VALUES ('Alex Lin');
クエリ:
SELECT * FROM students;
結果はこうなる:
| id | name | registration_date |
|---|---|---|
| 1 | Alex Lin | 2023-10-15 |
実践例
数値カラムのデフォルト値
例えば grades テーブルがあって、grade カラムはまだ点数がついてなかったらデフォルトで 0 にしたい場合:
CREATE TABLE grades (
id SERIAL PRIMARY KEY,
student_id INTEGER NOT NULL,
course_id INTEGER NOT NULL,
grade INTEGER DEFAULT 0
);
grade を指定せずにレコード追加:
INSERT INTO grades (student_id, course_id) VALUES (1, 101);
テーブルはこうなる:
| id | student_id | course_id | grade |
|---|---|---|---|
| 1 | 1 | 101 | 0 |
TEXT のデフォルト値
teachers テーブルで、先生を追加した時に自動で「未確認」ステータスをつけたい場合:
CREATE TABLE teachers (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
status TEXT DEFAULT '未確認'
);
ステータスなしで先生を追加:
INSERT INTO teachers (name) VALUES ('Peter Pall');
結果はこうなる:
| id | name | status |
|---|---|---|
| 1 | Peter Pall | 未確認 |
時間のデフォルト値
meetings テーブルで、会議の開始時間 meeting_time をデフォルトで午前10時にしたい場合:
CREATE TABLE meetings (
id SERIAL PRIMARY KEY,
topic VARCHAR(100),
meeting_time TIME DEFAULT '10:00'
);
レコード追加:
INSERT INTO meetings (topic) VALUES ('プロジェクトの話し合い');
結果:
| id | topic | meeting_time |
|---|---|---|
| 1 | プロジェクトの話し合い | 10:00 |
DEFAULT でよくあるミス
デフォルト値の型がカラムの型と合ってない。例えば数値カラムにテキストをデフォルト値にしようとすると、PostgreSQLに怒られる:
CREATE TABLE example (
number INTEGER DEFAULT 'テキスト'
);
エラー:
invalid input syntax for type integer.
DEFAULT を変えても既存レコードには影響しない。デフォルト値を変えても、すでにあるデータはそのまま。既存行を更新したいなら UPDATE を使おう。
UPDATE students SET registration_date = '2023-01-01' WHERE registration_date IS NULL;
DEFAULT と NOT NULL の混同。デフォルト値があるからといって、そのカラムが必須(NOT NULL)になるわけじゃない。NOT NULL を明示しないと、カラムは NULL も入るよ。
GO TO FULL VERSION