第 3 週 · 資料庫與 D1
SQL CRUD
用四個 SQL 動詞完成建立、讀取、更新、刪除。
正在打開這一關…
學習目標
- 寫出 INSERT、SELECT、UPDATE、DELETE
- 用 WHERE 指到某一列,而不是改到整張表
- 知道沒有 WHERE 的更新或刪除有多危險
CRUD 是四個動詞的縮寫:Create、Read、Update、Delete。SQL 裡對應 INSERT、SELECT、UPDATE、DELETE。今天在腦中與案例裡把句子寫對。真正連上 D1 是後天,但句子從今天開始就是同一套。
用生活例子理解
SQL 像對帳本管理員說的完整句子,而且管理員很認真,你沒說「只限某一列」,他就對整張表動手。
生活比喻:
DELETE FROM messages等於「把留言本全部撕掉」。DELETE FROM messages WHERE id = 3才是「撕掉 3 號那一頁」。
讀的時候也一樣。SELECT * 的星號表示所有欄位。學習時很方便,正式一點可以明確列出欄位,讓呼叫的人知道你真的需要哪些。
動手做
大約 25 分鐘。今天可以先寫在筆記,用案例對答案。若你已經裝了 sqlite3,也可以在本機開一個 practice.sqlite 試跑。沒有裝也沒關係,明天 Wrangler 會帶你跑在 D1 的本機模擬。
- 寫一句新增,作者
Ada,內容哈囉。 - 寫一句讀出全部,依
id由新到舊。 - 寫一句只把
id = 1的內容改成改過的哈囉。 - 寫一句刪掉
id = 1。 - 把第 4 句的
WHERE拿掉,在旁邊標「危險,不要執行」。 - 每一句標上它是 C、R、U、D 的哪一個。
案例
-- C 新增
INSERT INTO messages (author, body)
VALUES ('Ada', '哈囉');
-- R 讀取。DESC 是由大到小,最新的編號在前。
SELECT id, author, body, created_at
FROM messages
ORDER BY id DESC;
-- U 更新。WHERE 不可省略。
UPDATE messages
SET body = '改過的哈囉'
WHERE id = 1;
-- D 刪除。同樣要 WHERE。
DELETE FROM messages
WHERE id = 1;字串在 SQL 裡用單引號。這和 JSON 的雙引號不同。若內容本身有單引號,不能直接拼進去。下一課的 prepared statement 就是為了解決這件事,今天先用沒有引號的練習句子。
INSERT 沒寫 id 與 created_at,是因為建表時主鍵會自動發號,時間有預設值。
常見錯誤
- 更新或刪除忘了
WHERE,在正式資料庫上不可回復地改到每一列。 - 用雙引號包 SQL 字串。SQLite 的雙引號多半表示識別名(欄位或表名),不是文字。
SELECT *之後在程式裡假設欄位順序永遠不變。列出欄位比較穩。- 把 SQL 當成不區分任何空白的魔法。句子可以換行,但關鍵字不要拆碎。
自我檢查
- CRUD 四個字母在 SQL 裡各是哪個關鍵字?
- 為什麼
DELETE FROM messages比打錯一則留言更嚴重? - 新增時為什麼可以不寫
id?