哈囉,未來的 PostgreSQL 大神們!今天要聊的主題,絕對是寫程式時最有價值的技能之一——避免犯錯。錯誤當然不可能完全避免,尤其你們現在才剛開始學 SQL。但快速搞懂常見錯誤,絕對沒問題。這就像在黑暗的房間裡走路,撞幾次角落後,你就知道哪裡有障礙物啦。我會幫你們繞開「尖銳的角落」,在建立和修改資料表時少踩雷。
錯誤 1:資料型別選錯
選資料型別就像找鑰匙開鎖。選錯「鑰匙」——也就是資料型別,可能會讓你的資料表運作怪怪的,或是效率變差。
錯誤範例:
你想要建立一個欄位來存電話號碼,結果習慣性地選了 INTEGER。聽起來好像合理,畢竟號碼是數字嘛。但問題來了,INTEGER 不適合這種資料,因為:
- 開頭有 0(
0123456789會變成123456789)。 - 有像 "+" 或空格這種符號。
-- 錯誤寫法:
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
phone_number INTEGER -- 哎呀
);
-- 正確寫法:
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
phone_number VARCHAR(15) -- 適合存各種格式的號碼
);
怎麼避免?
選資料型別前,仔細想想你要存的資料本質。如果不確定,就去翻一下 PostgreSQL 官方資料型別文件。
錯誤 2:忽略 NOT NULL、CHECK、UNIQUE 限制
限制條件可以幫你維護資料完整性。忘了設,資料表就會亂七八糟,像是本來不能空的欄位卻有空值。
錯誤範例:你建立一個存學生的資料表,卻忘了名字和年齡是必填的。
-- 錯誤寫法:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
age INTEGER
);
INSERT INTO students (name, age) VALUES (NULL, NULL); -- 哇,這是什麼?!
正確寫法:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL, -- 名字必填
age INTEGER CHECK (age > 0) -- 年齡必須大於 0
);
怎麼避免?
必填欄位一定要設限制條件。這就像「保護機制」,可以擋掉有問題的資料。
錯誤 3:唯一性問題
有時候你會忘了在應該唯一的欄位加 UNIQUE 限制,結果就會有重複資料。
錯誤範例:你建立一個存 email 的資料表,卻忘了加 UNIQUE。
-- 錯誤寫法:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(100)
);
INSERT INTO users (email) VALUES ('user@example.com');
INSERT INTO users (email) VALUES ('user@example.com'); -- 這個 email 已經有了!
正確寫法:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(100) UNIQUE -- email 要唯一
);
怎麼避免?
只要欄位要唯一,就一定要加 UNIQUE。如果想要更彈性,可以用 CONSTRAINT 幫限制條件命名:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(100),
CONSTRAINT unique_email UNIQUE (email)
);
錯誤 4:修改資料表 (ALTER TABLE) 時出錯
用 ALTER TABLE 很容易踩雷,尤其資料表裡已經有資料時。比如你忘了考慮欄位裡的值,結果加限制時就會出錯。
錯誤範例:你想在已經存在的欄位加 NOT NULL 限制,但那欄有 NULL。
-- 錯誤寫法:
ALTER TABLE students ALTER COLUMN name SET NOT NULL; -- 錯誤!
如果資料表裡已經有 NULL,PostgreSQL 不會讓你加這個限制。
怎麼辦?
加限制前,先確定資料都符合要求。像這樣:
UPDATE students SET name = '未知' WHERE name IS NULL;
ALTER TABLE students ALTER COLUMN name SET NOT NULL;
錯誤 5:刪資料表或資料前沒檢查
用 DROP TABLE 刪資料表或 DELETE 刪資料,這種操作是無法復原的。所以刪之前一定要確認你在刪什麼。
錯誤範例:
DROP TABLE courses; -- 哎呀,刪錯表了!
怎麼避免?
在 psql 裡用 \dt 看一下有哪些資料表,確定要刪的是對的。
或是用 DROP TABLE IF EXISTS,這樣刪不存在的表也不會出錯:
DROP TABLE IF EXISTS courses;
錯誤 6:暫存表的問題
暫存表在 session 結束時就會消失。如果你 session 結束後還想用暫存表,就會出錯。
錯誤範例:
CREATE TEMP TABLE temp_students (
id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
-- session 結束後再...
SELECT * FROM temp_students; -- 錯誤:表已經不見了!
怎麼避免?
如果資料要跨 session 用,就存到一般資料表,或是註明這些暫存表只在一個 session 內用。
錯誤 7:測試時忘了加限制條件
開發時常常會想說「先不加限制,之後再補」,但通常「之後」就忘了。
錯誤範例:
CREATE TABLE test_table (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
);
-- 插入資料:
INSERT INTO test_table (name) VALUES ('重複名稱');
INSERT INTO test_table (name) VALUES ('重複名稱'); -- 問題來了...
怎麼避免?
就算只是測試,也要一開始就加好限制條件:
CREATE TABLE test_table (
id SERIAL PRIMARY KEY,
name VARCHAR(50) UNIQUE -- 省下很多麻煩
);
GO TO FULL VERSION