SQLite - 觸發器:初學者的友好指南
您好,有志於成為程序員的各位!今天,我們將踏上一段令人興奮的旅程,探索 SQLite 視發器的世界。別擔心如果你之前從未寫過一行代碼 - 我將成為你的友好指導者,我們將一步一步地探索這個主題。在這個教學結束時,你將能像專家一樣創建觸發器!
視發器是什麼?
在我們深入之前,讓我們想像你正在經營一家小型圖書館。每次有書被借出時,你需要更新多個記錄:將書標記為不可用,記錄借出日期,甚至可能還要發送提醒郵件。如果所有這些動作在書被借出時都能自動發生,那該有多好?這正是數據庫中觸發器的作用!
在 SQLite 中,觸發器是一種數據庫對象,當發生指定數據庫事件時會自動執行。這就像設定多米諾骨牌效應 - 當一件事發生時,它會自動導致其他事情發生。
創建你的第一個觸發器
讓我們從一個簡單的例子開始。想像我們在圖書館數據庫中有一個名為 books
的表:
CREATE TABLE books (
id INTEGER PRIMARY KEY,
title TEXT,
author TEXT,
available INTEGER
);
現在,讓我們創建一個觸發器,當書被借出時自動將其設定為不可用(0):
CREATE TRIGGER make_unavailable
AFTER INSERT ON borrowings
FOR EACH ROW
BEGIN
UPDATE books SET available = 0 WHERE id = NEW.book_id;
END;
讓我們分解這段代碼:
-
CREATE TRIGGER make_unavailable
:我們正在創建一個名為 "make_unavailable" 的新觸發器。 -
AFTER INSERT ON borrowings
:這個觸發器將在 "borrowings" 表中插入新行後觸發。 -
FOR EACH ROW
:對於 INSERT 操作影響的每一行,觸發器將執行一次。 -
BEGIN ... END
:這個區塊包含觸發器將要執行的動作。 -
UPDATE books SET available = 0 WHERE id = NEW.book_id
:這會更新 "books" 表,將借出的書的 "available" 列設定為 0。
視發器的類型
SQLite 支援多種類型的觸發器。讓我們看看它們:
1. BEFORE 視發器
這些觸發器在數據庫操作發生之前觸發。它們很適合在插入或更新數據之前進行驗證或修改。
CREATE TRIGGER check_author
BEFORE INSERT ON books
FOR EACH ROW
BEGIN
SELECT CASE
WHEN NEW.author IS NULL THEN
RAISE(ABORT, 'Author cannot be null')
END;
END;
這個觸發器在插入新書之前檢查作者是否為空,如果是,則引發錯誤。
2. AFTER 視發器
我們在第一個例子中已經看到了 AFTER 視發器。這些視發器在數據庫操作發生後觸發。它們適用於維護相關數據或記錄變更。
3. INSTEAD OF 視發器
這些是只用於視圖的特殊觸發器。它們允許你在通過視圖嘗試修改數據時定義自定義行為。
CREATE VIEW available_books AS
SELECT * FROM books WHERE available = 1;
CREATE TRIGGER update_available_books
INSTEAD OF UPDATE ON available_books
FOR EACH ROW
BEGIN
UPDATE books SET
title = NEW.title,
author = NEW.author
WHERE id = OLD.id;
END;
這個觸發器允許更新 "available_books" 視圖,然後更新底層的 "books" 表。
視發器事件
觸發器可以設定為在不同的事件上觸發:
事件 | 描述 |
---|---|
INSERT | 當新行被插入表中時觸發 |
UPDATE | 當表中的行被更新時觸發 |
DELETE | 當從表中刪除行時觸發 |
你可以甚至為單個觸發器指定多個事件:
CREATE TRIGGER log_changes
AFTER INSERT OR UPDATE OR DELETE ON books
FOR EACH ROW
BEGIN
INSERT INTO log (action, book_id, timestamp)
VALUES (
CASE
WHEN NEW.id IS NOT NULL AND OLD.id IS NULL THEN 'INSERT'
WHEN NEW.id IS NULL AND OLD.id IS NOT NULL THEN 'DELETE'
ELSE 'UPDATE'
END,
COALESCE(NEW.id, OLD.id),
DATETIME('NOW')
);
END;
這個觸發器記錄 "books" 表的所有變更(插入、更新和刪除)。
列出觸發器
現在我們已經創建了一些觸發器,你可能會想,“我如何能看到數據庫中的所有觸發器?”這個問題問得好!SQLite 提供了一種方便的方法來列出所有觸發器:
SELECT name, sql FROM sqlite_master WHERE type = 'trigger';
這個查詢會顯示所有觸發器的名稱和創建它們的 SQL。這就像偷窺幕後,看見魔法是如何發生的!
刪除觸發器
有時候,你可能需要移除一個觸發器。也許它不再需要,或者你想要用另一個不同的觸發器來替換它。刪除觸發器非常簡單:
DROP TRIGGER IF EXISTS make_unavailable;
這個命令會移除我們之前創建的 "make_unavailable" 視發器。IF EXISTS
子句是一個安全網 - 如果觸發器不存在,它可以防止出現錯誤。
結論
恭喜你!你已經踏出了進入 SQLite 視發器世界的第一步。我們已經介紹了創建觸發器、不同類型的觸發器、觸發器事件、列出觸發器,甚至還有如何移除它們。
記住,觸發器是強大的工具,可以使你的數據庫工作更聰明,而不是更努力。它們就像在幕後辛勤工作的小精靈,保持你的數據一致和最新。
當你繼續你的編程旅程時,你會發現觸發器的用途越來越多。它們可能起初看起來有點複雜,但隨著練習,你將能夠創建複雜的觸發器系統,讓你的數據庫跳起舞來!
繼續嘗試,持續學習,最重要的是,玩得開心!數據庫的世界浩瀚而令人興奮,而你只是剛剛開始刮破表面。誰知道你會創造出什麼令人驚奇的事物呢?
Credits: Image by storyset