CodeGym /コース /SQL SELF /制約付きテーブルへのデータ挿入: NOT NULL, DEFAULT

制約付きテーブルへのデータ挿入: NOT NULL, DEFAULT

SQL SELF
レベル 21, レッスン 1
使用可能

今日はデータベース操作のもう一つ大事なポイントを詳しく見ていくよ。つまり、NOT NULLやDEFAULT制約があるテーブルにどうやってデータを挿入するかって話。ここまででINSERT INTOコマンドの基本的な書き方や、決まった構造のテーブルに行を追加する方法はもう知ってるよね。じゃあ、そろそろ細かいところに踏み込もう。制約付きのテーブルって、開発者にとってはよく頭を悩ませるポイントなんだ。でも心配しなくて大丈夫!このレクチャーが終わる頃には、きっと自信を持って扱えるようになるよ!

制約って何?

制約(constraint)っていうのは、テーブルのカラムにかけるルールのこと。これがあると、データが論理的に正しい形で保存されるんだ。例えば、絶対にデータが必要なカラムは空にできない(NOT NULL)、逆にデフォルト値が決まってるカラムは値を省略してもOK(DEFAULT)みたいな感じ。

制約の種類: - NOT NULL — このカラムはNULLを入れちゃダメ。 - DEFAULT — 何も指定しなかったら自動でこの値が入る。

制約はデータの整合性を守るために超大事。例えば、studentsテーブルで学生のリストを管理してて、「学生には必ず名前が必要(NOT NULL)」ってルールがあるとする。これがないと、うっかり名前を入れ忘れて「名無しの学生」がDBにできちゃうかも。他にも、新しいコースの単位数はデフォルトで0にしたい(DEFAULT)って決めておけば、毎回考えなくて済むよね。

NOT NULL制約の使い方

NOT NULL制約があると、レコード追加時にそのカラムの値を必ず指定しなきゃいけない。もしNULLを入れたり、そもそも値を指定しなかったりすると、DBが「え、ダメだよ!」って怒ってくる(エラーになる)。例を見てみよう。

シンプルなstudentsテーブルを作ってみる:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,     -- 名前は空にできない
    age INT
);

注目ポイント:nameカラムにはNOT NULL制約があるけど、ageカラムには何もない。

NOT NULL付きデータ挿入例

じゃあ、学生を追加してみよう:

-- 成功例
INSERT INTO students (name, age) VALUES ('Alice', 23);
-- OK: 名前が指定されてるからNOT NULL制約クリア

-- エラー例:
INSERT INTO students (age) VALUES (30);
-- エラー: nameカラムはNULLにできないからNOT NULL制約違反

もしnull value in column "name" violates not-null constraintみたいなエラーが出ても、ビビらなくてOK。PostgreSQLが「ちゃんと気をつけてね」って教えてくれてるだけ。

デフォルト値(DEFAULT)の使い方

DEFAULT制約はDBに「このカラム、値が指定されなかったらこれ使っといて!」って伝えるもの。これがあると、毎回全部のカラムを埋めなくてもよくなるから、開発がラクになるよ。

DEFAULT制約付きテーブル例

coursesテーブルを作ってみよう:

CREATE TABLE courses (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    credits INT DEFAULT 0   -- creditsカラムのデフォルト値は0
);

DEFAULT付きデータ挿入例

じゃあ、コースを追加してみよう:

-- creditsに値を明示的に指定
INSERT INTO courses (name, credits) VALUES ('Mathematics', 5);

-- creditsを省略した場合、デフォルト値(0)が使われる
INSERT INTO courses (name) VALUES ('History');

-- 結果を見てみよう
SELECT * FROM courses;

結果:

id name credits
1 Mathematics 5
2 History 0

注目:Historyコースを追加したとき、creditsを指定しなかったけど、PostgreSQLが自動でcreditsカラムに0を入れてくれた。

NOT NULLとDEFAULTの併用

こういうカラムは、値が必須だけど、指定しなくてもデフォルト値が入るって感じ。例えばcoursesテーブルのcreditsカラムはDEFAULTとNOT NULL両方つけて、「絶対NULLはダメだけど、指定しなかったら0にしとく」みたいな使い方ができる。

CREATE TABLE courses (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    credits INT NOT NULL DEFAULT 0
);

データ挿入例

新しいコースはデフォルトで単位数0、でもNULLは絶対ダメって場合:

-- OK: creditsはデフォルト値
INSERT INTO courses (name) VALUES ('Physics');

-- エラー: NOT NULL付きカラムにNULLを明示的に入れようとした
INSERT INTO courses (name, credits) VALUES ('Chemistry', NULL);

例:必須の名前付きで学生を追加

studentsテーブルを制約付きで作ってみる:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,                         -- 名前は必須
    enrollment_date DATE DEFAULT CURRENT_DATE   -- 入学日はデフォルトで今日
);

じゃあ、学生を追加してみよう:

-- 名前を指定、入学日は自動で入る
INSERT INTO students (name) VALUES ('Bob');

-- 名前を指定しないと(エラーになる)
INSERT INTO students (enrollment_date) VALUES ('2024-10-01');

PostgreSQLがデータの正しさを保証してくれる良い例だね。全員必ず名前があって、入学日は自動で入るから手間いらず。

コツと「落とし穴」

NOT NULLやDEFAULT制約を使うときは、いくつか大事なことを覚えておこう。例えば、データにNULLがよく出てくる場合、NOT NULL制約はマジで面倒になることもある。逆に、全部のカラムにデフォルト値をつけると、うっかり変なデータ(例えば本当は違うのに0が入っちゃうとか)になることも。

普通、既存テーブルに新しいカラムを追加すると、既存の行はNULLで埋まる。でも、DEFAULT Xを指定すれば、そのカラム全部がXで埋まる。これ、めっちゃ便利でDBの整合性を保つのに役立つよ。

例えば、新しいカラムが既存テーブルへのFOREIGN KEYだった場合。NULLや0はダメで、必ず既存テーブルの行を参照しなきゃいけない、みたいなケースね。

制約を後から追加したいときは?

大丈夫、制約は後からでもALTER TABLEコマンドで追加できるよ。例えば:

-- 既存カラムにDEFAULT制約を追加
ALTER TABLE courses ALTER COLUMN credits SET DEFAULT 0;

-- 既存カラムにNOT NULL制約を追加
ALTER TABLE students ALTER COLUMN name SET NOT NULL;

これらのクエリは既存データを壊さないから、すでに大事なデータが入ってるテーブルにも安心して使えるよ。

これでPostgreSQLの制約を使いこなす準備はバッチリ!データはもっと構造的でミスに強くなるし、クエリも論理的で予測しやすくなるよ。

2
タスク
SQL SELF, レベル 21, レッスン 1
ロック未解除
NOT NULLとDEFAULTの併用
NOT NULLとDEFAULTの併用
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION