CodeGym /課程 /SQL SELF /建立與修改資料表時常見的錯誤

建立與修改資料表時常見的錯誤

SQL SELF
等級 18 , 課堂 4
開放

哈囉,未來的 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 NULLCHECKUNIQUE 限制

限制條件可以幫你維護資料完整性。忘了設,資料表就會亂七八糟,像是本來不能空的欄位卻有空值。

錯誤範例:你建立一個存學生的資料表,卻忘了名字和年齡是必填的。

-- 錯誤寫法:
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 -- 省下很多麻煩
);
2
任務
SQL SELF, 等級 18, 課堂 4
上鎖
建立具有正確資料型態的資料表
建立具有正確資料型態的資料表
2
任務
SQL SELF, 等級 18, 課堂 4
上鎖
為現有資料表新增限制條件
為現有資料表新增限制條件
1
問卷/小測驗
變更資料表結構,等級 18,課堂 4
未開放
變更資料表結構
變更資料表結構
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION