PostgreSQL - 約束條件:數據完整性的友好指南

你好啊,未來的數據庫大師!? 今天,我們將進入PostgreSQL約束的奇妙世界。別擔心你對此還是新手;我們會一步步來,等到最後,你會像專業人士一樣約束數據!讓我們一起開始這次令人興奮的旅程吧。

PostgreSQL - Constraints

究竟什麼是約束條件?

在我們深入之前,讓我們先來討論一下約束條件是什麼。想像你正在搭建一個紙牌房子。每張紙牌都需要精確放置,否則整個結構可能會倒塌。數據庫中的約束就像建造那個紙牌房子的規則——它們保證我們的數據被正確結構化並保持其完整性。

約束條件的類型

PostgreSQL提供了多種類型的約束。讓我們通過示例和解釋來探討每一種。

約束類型 描述
NOT NULL 保證列不能有NULL值
UNIQUE 保證列中的所有值都是唯一的
PRIMARY KEY 在表中唯一標識每一行
FOREIGN KEY 在表之間鏈接數據
CHECK 保證列中的所有值滿足特定條件
EXCLUSION 保證如果將任何兩行在指定的列上使用指定的操作符進行比較,則不是所有這些比較都會返回TRUE

NOT NULL約束

NOT NULL約束就像一位嚴格的老師,不會接受考試上的空白答案。它保證列必須始終包含一個值。

讓我們為我們假想的書店創建一個表:

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約束就像為你的朋友分配獨特的綽號。沒有兩個可以擁有相同的綽號。

讓我們為我們的books表添加一個UNIQUE約束:

ALTER TABLE books
ADD CONSTRAINT unique_isbn UNIQUE (isbn);

現在,如果我們嘗試添加兩本ISBN相同的書:

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

第二個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就像社交網絡中的連接。它們在表之間鏈接數據。

讓我們創建一個orders表,它引用我們的customers表:

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 &&)
);

這樣可以確保對於任何兩行,不是兩個房間號碼相等和時間範圍重疊都為真。

刪除約束

有時候,我們需要移除約束,就像改變我們遊戲的規則一樣。以下是如何刪除約束的方法:

-- 刪除一個命名的約束
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旅程時,請繼續實驗這些約束。嘗試以不同的方式將它們組合起來,你很快就會發現自己能夠創建有力和可靠的數據庫設計。祝你好運,開心地約束數據!

Credits: Image by storyset