PostgreSQL - 制約: データ整合性の親切なガイド
こんにちは、未来のデータベース魔術師たち!?今日は、PostgreSQLの制約の素晴らしい世界に飛び込みます。新しいことばかりでも心配しないでください;ステップバイステップで進め、最後にはプロのようにデータを制約できるようになります!一緒にこのエキサイティングな旅に出発しましょう。
制約とは?
まず、制約とは何かについて話しましょう。カードの家を建てていると考えてみてください。それぞれのカードは正確に置かれる必要があり、それができなければ整个構造が崩れるかもしれません。データベースの制約は、カードの家を建てるルールのようなものです。データが正しく構造化され、整合性を保つことを確保します。
制約の種類
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)
);
この例では、title
とauthor
は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