PostgreSQL - 約束條件:數據完整性的友好指南
你好啊,未來的數據庫大師!? 今天,我們將進入PostgreSQL約束的奇妙世界。別擔心你對此還是新手;我們會一步步來,等到最後,你會像專業人士一樣約束數據!讓我們一起開始這次令人興奮的旅程吧。
究竟什麼是約束條件?
在我們深入之前,讓我們先來討論一下約束條件是什麼。想像你正在搭建一個紙牌房子。每張紙牌都需要精確放置,否則整個結構可能會倒塌。數據庫中的約束就像建造那個紙牌房子的規則——它們保證我們的數據被正確結構化並保持其完整性。
約束條件的類型
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)
);
在這個示例中,title
和author
是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