CodeGym /コース /SQL SELF /DEFAULT を使ったデフォルト値の使い方

DEFAULT を使ったデフォルト値の使い方

SQL SELF
レベル 17, レッスン 2
使用可能

たまに全部のカラムを手動で埋めたくない時あるよね。まあ、めんどいし、そもそも必要なデータがない場合もあるし。そんな時は、あらかじめデフォルト値を設定しておけば、必要な時に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 email
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 email
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 も入るよ。

2
タスク
SQL SELF, レベル 17, レッスン 2
ロック未解除
`DEFAULT`を使った数値カラムのテーブル作成
`DEFAULT`を使った数値カラムのテーブル作成
2
タスク
SQL SELF, レベル 17, レッスン 2
ロック未解除
複数のカラムで `DEFAULT` 値を使う
複数のカラムで `DEFAULT` 値を使う
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION