今日はデータベース操作のもう一つ大事なポイントを詳しく見ていくよ。つまり、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の制約を使いこなす準備はバッチリ!データはもっと構造的でミスに強くなるし、クエリも論理的で予測しやすくなるよ。
GO TO FULL VERSION