MySQL - 檢查約束:初學者指南

你好,有抱負的數據庫愛好者!我很興奮能夠成為你進入MySQL檢查約束世界的嚮導。作為一個教了多年計算機科學的人,我親身感受到新概念可能會是多麼令人却步。但是別擔心 - 我們會一步步來,到最後,你會變成檢查約束的高手!

MySQL - Check Constraints

檢查約束是什麼?

在我們深入之前,讓我們從基礎開始。想像你正在記錄你朋友們的年齡。你可能不會想意外地輸入一個負數或者一個荒謬的高數字,對吧?這就是檢查約束派上用場的地方!

檢查約束就像俱樂部的保鏢一樣 - 它會檢查進入你表中的數據是否符合某些條件。如果不符合,就不允許進入。簡單吧!

MySQL的檢查約束

MySQL從版本8.0.16開始引入了檢查約束。如果你正在使用早期版本,別擔心 - 我們稍後會介紹使用觸發器的替代方法。

讓我們從一個基本例子開始:

CREATE TABLE friends (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT CHECK (age >= 0 AND age <= 120)
);

在這個例子中,我們正在創建一個名為'friends'的表。檢查約束確保'age'值在0到120之間。這就像是告訴保鏢:"只讓0到120歲的人進來!"

使用觸發器的檢查約束

對於那些使用MySQL早期版本的人來說,別感到被排除在外!我們可以使用觸發器達到類似的功能。這樣做:

DELIMITER //
CREATE TRIGGER check_age
BEFORE INSERT ON friends
FOR EACH ROW
BEGIN
IF NEW.age < 0 OR NEW.age > 120 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '年齡必須在0到120歲之間';
END IF;
END;//
DELIMITER ;

這個觸發器就像我們的保鏢,在每個新條目插入表之前進行檢查。

在單個列上添加檢查約束

讓我們說我們想要確保我們'friends'表中的名字至少有2個字符長:

ALTER TABLE friends
ADD CONSTRAINT check_name_length
CHECK (LENGTH(name) >= 2);

現在,嘗試插入少於2個字符的名字將會導致錯誤。這就像我們的保鏢說:"對不起,你的名字太短了。你不能進來!"

在多個列上添加檢查約束

有時候,我們需要同時檢查多個列。讓我們說我們想要確保一個朋友的喜歡的數字始終小於他們的年齡:

ALTER TABLE friends
ADD COLUMN favorite_number INT,
ADD CONSTRAINT check_favorite_number
CHECK (favorite_number < age);

這個約束同時檢查兩個列。這就像我們的保鏢在讓你進入之前檢查你的身份證和票!

在現有表上添加檢查約束

如果我們已經有一個表並且想要添加一個檢查約束怎麼辦?沒問題!我們可以使用ALTER TABLE命令:

ALTER TABLE friends
ADD CONSTRAINT check_age
CHECK (age >= 0 AND age <= 120);

這將年齡檢查添加到現有的'friends'表中。這就像為我們已經開業的俱樂部雇用一個新的保鏢!

刪除檢查約束

有時候,我們可能需要移除一個檢查約束。這樣做:

ALTER TABLE friends
DROP CONSTRAINT check_age;

這從我們的'friends'表中移除了'check_age'約束。這就像告訴我們的保鏢:"你可以回家了。我們不再需要年齡檢查了。"

使用客戶端程序添加檢查約束

如果你正在使用像MySQL Workbench這樣的客戶端程序,你可以通過GUI添加檢查約束。這通常在'Alter Table'選項下找到。記住,即使如此,底層的SQL仍然在執行 - GUI只是讓它更加用戶友好!

結論

好了,各位!你們已經邁出了進入MySQL檢查約束世界的第一步。記住,這些約束是你的數據庫的保鏢 - 它們將不良數據拒之門外,並確保只有好東西進來。

以下是我們所介紹的方法的快速總結:

方法 描述
CREATE TABLE with CHECK 在創建新表時添加約束
觸發器 用於早期的MySQL版本
ALTER TABLE ADD CONSTRAINT 在現有表上添加約束
ALTER TABLE DROP CONSTRAINT 移除現有的約束

練習這些概念,嘗試不同的約束,不用多久,你會變成一名數據庫保鏢專家!記住,在數據庫世界中,好的約束會讓鄰居變得更好。快樂編程!

Credits: Image by storyset