PostgreSQL - 制約: データ整合性の親切なガイド

こんにちは、未来のデータベース魔術師たち!?今日は、PostgreSQLの制約の素晴らしい世界に飛び込みます。新しいことばかりでも心配しないでください;ステップバイステップで進め、最後にはプロのようにデータを制約できるようになります!一緒にこのエキサイティングな旅に出発しましょう。

PostgreSQL - Constraints

制約とは?

まず、制約とは何かについて話しましょう。カードの家を建てていると考えてみてください。それぞれのカードは正確に置かれる必要があり、それができなければ整个構造が崩れるかもしれません。データベースの制約は、カードの家を建てるルールのようなものです。データが正しく構造化され、整合性を保つことを確保します。

制約の種類

PostgreSQLはいくつかの制約を提供しています。それぞれの制約を例と説明とともに見ていきましょう。

制約の種類 説明
NOT NULL 列がNULL値を持たないことを確保
UNIQUE 列のすべての値が異なることを確保
PRIMARY KEY テーブルの各行を一意に識別
FOREIGN KEY テーブル間のデータをリンク
CHECK 列のすべての値が特定の条件を満たすことを確保
EXCLUSION 指定された列に対して指定された演算子を使用して2行を比較した場合、すべての比較がTRUEを返さないことを確保

NOT NULL制約

NOT NULL制約は、 strictな先生のように、テストの空白な回答を受け入れないものです。列が常に値を含むことを確保します。

次に、架空の書店のためのテーブルを作成してみましょう:

CREATE TABLE books (
book_id SERIAL PRIMARY KEY,
title VARCHAR(100) NOT NULL,
author VARCHAR(100) NOT NULL,
price DECIMAL(10, 2)
);

この例では、titleauthorはNOT NULLで、すべての本にはタイトルと著者が存在する必要があります。しかし、priceはNULLでも構いません。おそらく価格が設定されていない本のためです。

UNIQUE制約

UNIQUE制約は、友達にユニークなニックネームを付けるようなものです。2人に同じニックネームは与えられません。

booksテーブルにUNIQUE制約を追加してみましょう:

ALTER TABLE books
ADD CONSTRAINT unique_isbn UNIQUE (isbn);

同じISBNを持つ2冊の本を追加しようとした場合:

INSERT INTO books (title, author, isbn) VALUES ('Book 1', 'Author 1', '1234567890');
INSERT INTO books (title, author, isbn) VALUES ('Book 2', 'Author 2', '1234567890');

2つ目のINSERTは失敗し、データをクリーンでユニークに保つことができます!

PRIMARY KEY制約

PRIMARY KEYは、スポーツチームのキャプテンのように、ユニークで不可欠です。テーブルの各行を一意に識別します。

私たちはすでにbooksテーブルでPRIMARY KEYを定義しています(book_id),でも別のテーブルを作成して説明しましょう:

CREATE TABLE customers (
customer_id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE
);

ここで、customer_idはPRIMARY KEYです。自動的にインクリメントされ、新しい顧客ごとにユニークです。

FOREIGN KEY制約

FOREIGN KEYは、ソーシャルネットワークの接続のように、テーブル間のデータをリンクします。

customersテーブルを参照するordersテーブルを作成しましょう:

CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_id INTEGER,
order_date DATE NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

customersテーブルに存在しない顧客に対して注文を追加することはできません。住所が存在しない住所に手紙を送るようなものです!

CHECK制約

CHECK制約は、クラブのバウンサーのように、正しいデータだけを入れることを確保します。

booksテーブルにCHECK制約を追加して、すべての本の価格が正であることを確保しましょう:

ALTER TABLE books
ADD CONSTRAINT positive_price CHECK (price > 0);

価格が負である本を追加しようとした場合:

INSERT INTO books (title, author, price) VALUES ('Cheap Book', 'Frugal Author', -5.99);

PostgreSQLは丁寧に拒否し、データを論理的で一貫した状態に保ちます。

EXCLUSION制約

EXCLUSION制約は、ボードゲームの複雑なルールのようなものです。必要なときには強力ですが、高度です。

次に、イベントのスケジュールを考えてみましょう。同じ部屋で重複しないようにします:

CREATE TABLE events (
event_id SERIAL PRIMARY KEY,
room_no INTEGER,
event_start TIMESTAMP,
event_end TIMESTAMP,
EXCLUDE USING gist (room_no WITH =, tsrange(event_start, event_end) WITH &&)
);

これにより、2行のどちらかが部屋番号が等しくて、時間範囲が重なる場合、両方の比較がTRUEを返さないことが確保されます。

制約の削除

時々、規則を変更するために制約を削除する必要があります。制約を削除する方法を以下に示します:

-- 名前付き制約の削除
ALTER TABLE books DROP CONSTRAINT unique_isbn;

-- PRIMARY KEYの削除
ALTER TABLE books DROP CONSTRAINT books_pkey;

-- FOREIGN KEYの削除
ALTER TABLE orders DROP CONSTRAINT orders_customer_id_fkey;

制約を削除する際には注意深く行ってください。データ整合性に影響を与える可能性があります!

結論

おめでとうございます!PostgreSQLの制約の大旅行を終えました。NOT NULLからEXCLUSIONまで、データをクリーンで一貫して構造化するためのツールを手に入れました。制約を使用することは、家の強固な基盤を築くようなものです。最初は少し手間暇がかかるかもしれませんが、後々のトラブルを防ぐために価値があります。

PostgreSQLの旅を続ける中で、これらの制約をさまざまな方法で試してみてください。異なる組み合わせで使うと、 soonに強固で信頼性の高いデータベース設計ができるようになります。楽しみましょう!

Credits: Image by storyset