【入門編】 CHECK制約 – PostgreSQL

皆さん、こんにちは!人気技術ブログ『DBマスターへの道』の管理人、〇〇です!

データ入力って、人間がすることだから、つい間違えちゃったり、うっかり変な値を入れちゃったりすること、ありますよね?例えば、年齢の欄にマイナス1歳って入力しちゃったり、テストの点数に120点って入れちゃったり……。

そんな「うっかりミス」から大切なデータを守ってくれる、とっても頼りになる存在が、今回ご紹介する「CHECK制約」なんです!

IT初心者の方や、これからデータベースを学び始める方に向けて、専門用語は極力避けつつ、日常の出来事に例えながら、この便利なCHECK制約について優しく解説していきますね。

CHECK制約って、どんなもの?〜身近な例で考えてみよう〜

CHECK制約を一言でいうと、「データベースに保存するデータが、特定の条件(ルール)を満たしているか、常にチェックしてくれる番人」のようなものです。

ちょっと身近な例で考えてみましょう。

お店での「年齢確認」と「高さ制限」

スーパーでお酒を買うとき、レジで年齢確認をされること、ありますよね?もし20歳未満だったら、お酒は買えません。これって、お店が「20歳未満の人にはお酒を売らない」というルールを設けているからですよね。

あるいは、立体駐車場に入るとき、入り口に「高さ2.3m以下」という看板を見たことはありませんか?もし車高がそれより高かったら、駐車場には入れません。これも、「この駐車場には、高さ2.3m以下の車しか入れません」というルールがあるからです。

データベースの世界でも、こんな風に「このデータは、こんなルールを守ってね!」という約束事を決められるのが、まさに『CHECK制約』なんです。

CHECK制約がないと、どうなっちゃうの?

もし、お店に年齢確認のルールがなかったらどうでしょう?間違って未成年にお酒を売ってしまうかもしれません。そうなると、お店もお客さんも困ってしまいますよね。

データベースも同じで、ルールがないと、例えばこんな「ありえないデータ」が入っちゃう可能性があります。

  • 社員の給料が「-10000円」(マイナスのお給料って、さすがにないですよね!)
  • テストの点数が「150点」(満点が100点なのに、それ以上は変!)
  • 性別の欄に「不明」や「宇宙人」(「男性」か「女性」だけにしてほしい!)

こんなデータが大切なデータベースに混じってしまうと、後で給料計算が合わなくなったり、報告書がめちゃくちゃになったりして、もう大変!「え、なんでこんなデータが入ってるの!?」って、頭を抱えることになっちゃいます。

CHECK制約は、そんな「ありえないデータ」がデータベースに入り込むのを、入り口でピシャリと防いでくれる強力な味方なんです。

CHECK制約を使ってみよう!〜PostgreSQLでの設定方法〜

では、実際にPostgreSQLでCHECK制約を設定する方法を見てみましょう。今回は「生徒の点数」を例にしてみますね。

「テストの点数は、0点から100点の間にしてくださいね!」というルールを設定してみましょう。

テーブルを作るときに設定する場合

新しいテーブルを作る時に、一緒にCHECK制約を設定するのが一番シンプルで分かりやすい方法です。

CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
score INTEGER CHECK (score >= 0 AND score <= 100) ); ちょっと難しそうな呪文に見えるかもしれませんが、大丈夫。ポイントは、`score INTEGER CHECK (score >= 0 AND score <= 100)` の部分だけです。

  • `score INTEGER`: `score`という名前の、整数を入れるカラムだよ、という意味です。
  • `CHECK (score >= 0 AND score <= 100)`: ここがCHECK制約!「`score`の値は0以上、かつ100以下であること」というルールを設定しています。

これで、「`students`テーブルの`score`カラムには、必ず0点から100点の間の数字しか入れられない」というルールができました!

既存のテーブルに後から設定する場合

もし、すでに作ってしまったテーブルに後からCHECK制約を追加したい場合は、`ALTER TABLE`という命令を使えば簡単に追加できますよ。

例えば、`employees`(従業員)テーブルの`salary`(給料)カラムに「給料は0円以上であること」というルールを追加してみましょう。

ALTER TABLE employees
ADD CONSTRAINT check_salary_positive CHECK (salary >= 0);

  • `ALTER TABLE employees`: `employees`テーブルを変更します、という意味です。
  • `ADD CONSTRAINT check_salary_positive`: 新しい制約を追加します。「`check_salary_positive`」は、この制約にあなたが付けた名前です。分かりやすい名前を付けておくと、後で管理しやすいですよ。
  • `CHECK (salary >= 0)`: 「`salary`の値は0以上であること」というルールを設定しています。

これで、`employees`テーブルの`salary`カラムには、マイナスの給料が入ることはなくなりました!

実際に試してみよう!エラーになるってことは、ちゃんと守られている証拠!

それでは、先ほど作った`students`テーブルを使って、実際にCHECK制約がどう働くか見てみましょう。

成功するケース(ルールを守っている場合)

まずは、ルール通りの正しいデータを入力してみます。

— 点数が95点(0点〜100点の範囲内)なので成功
INSERT INTO students (name, score) VALUES (‘山田 太郎’, 95);

これは問題なく実行され、データがテーブルに保存されます。

失敗するケース(ルールを破った場合)

次に、ルールを破るようなデータを入力してみましょう。

— 点数が-5点(0点未満)なので失敗するはず
INSERT INTO students (name, score) VALUES (‘田中 花子’, -5);

このSQLを実行すると、PostgreSQLはこんな感じのエラーを出してくれます。

ERROR: new row for relation “students” violates check constraint “students_score_check”
DETAIL: Failing row contains (2, 田中 花子, -5).

「`students`テーブルの新しい行が、`students_score_check`というCHECK制約に違反しています!」と怒られましたね。

さらに、もう一つ。

— 点数が105点(100点超過)なので失敗するはず
INSERT INTO students (name, score) VALUES (‘鈴木 一郎’, 105);

これも同じようにエラーが出ます。

見てください!ちゃんとエラーが出ましたよね?これこそ、CHECK制約があなたのデータをしっかり見張ってくれている証拠なんです。ルールを破ろうとするデータは、データベースには絶対に入れません!と、きっぱり断ってくれるわけです。

CHECK制約のここがすごい!〜使うとこんなに嬉しいこと〜

CHECK制約を使うと、データベースの管理がぐっと楽になり、嬉しいことがたくさんあります。

  • データの信頼性がアップ!: 「ありえないデータ」が入り込む余地がなくなるので、常に正しいデータだけがデータベースに保存されている、という安心感が得られます。データの品質が格段に上がりますよ。
  • 間違い探しが楽になる!: データが間違っているかどうかを、アプリケーション(Webサイトやスマホアプリなど)側で毎回チェックする手間が省けます。データベース自身がルールを守ってくれるので、プログラマーの負担も減るんです。
  • みんなが同じルールで使える!: 誰がデータを入れても、データベース自身がルールを守ってくれるので、「あの人は変なデータを入れてるけど、この人はちゃんとしてる」なんてバラつきがなくなります。みんなが同じ品質のデータを使えるようになるんです。

まとめ

CHECK制約は、データベースをただのデータの箱ではなく、「賢く、間違いに強いデータ管理システム」にするための、本当に大切な一歩なんです。

最初はちょっと難しく感じるかもしれませんが、こうしてデータベース自身にルールを守らせる仕組みを作っておくことで、将来的に大きなトラブルを防いでくれるんですよ。データ入力のミスはつきものですが、データベースが賢く見張ってくれることで、私たちはもっと安心してデータを扱えるようになります。

これからも一緒に、データベースの世界を楽しく探検していきましょう!それでは、また次回の記事でお会いしましょう!

コメント

タイトルとURLをコピーしました