SQL - 檢查約束:您數據完整的友好指南

你好啊,未來的 SQL 巫師們!今天,我們將要深入 SQL 檢查約束的神奇世界。別擔心如果你是編程新手——我會成為你這次冒險的導遊,我們會一步步來。所以,拿起你喜歡的飲料,放鬆身心,讓我們開始這段旅程吧!

SQL - Check Constraint

SQL 檢查約束:您數據的最佳朋友

想像一下你正在籌備一個派對,並希望確保只有年滿 18 歲以上的賓客才能參加。檢查約束對你的數據庫做的就是這樣的事情——它就像一名門衛,確保只有正確的數據能夠進入!

檢查約束是我們在表中的一列(或多列)上設置的一條規則,以確保數據在允許進入之前符合某些條件。這就像是給你的數據庫一種超能力,以保持數據的完整性!

讓我們通過一些例子來讓這個概念更清晰。

在單列上應用檢查約束:獨奏表演

當我們在一個單列上應用檢查約束時,我們是在告訴這列:"嘿,你有一個任務——確保數據遵循這個規則!"

以下是一個例子:

CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Age INT CHECK (Age >= 18)
);

在這個例子中,我們創建了一個 Employees 表,並在 Age 列上設置了一個檢查約束。這個約束確保任何輸入的年齡必須是 18 歲或以上。如果有人試圖插入一名年齡小於 18 歲的員工,數據庫會有禮貌地拒絕,就像我們派對的門衛一樣!

讓我們試著插入一些數據:

-- 這個會成功
INSERT INTO Employees (EmployeeID, FirstName, LastName, Age)
VALUES (1, 'John', 'Doe', 25);

-- 這個會失敗
INSERT INTO Employees (EmployeeID, FirstName, LastName, Age)
VALUES (2, 'Jane', 'Smith', 17);

第一個 INSERT 說明會成功,因為 25 大於或等於 18。然而,第二個會失敗,因為 17 不符合我們的檢查約束。我們的數據門衛正在履行它的職責!

在多列上應用檢查約束:動力二重奏

有時候,我們需要檢查一個涉及多於一列的條件。這時,多列檢查約束就派上用場了!

以下是一個例子:

CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
OrderDate DATE,
ShipDate DATE,
CHECK (ShipDate >= OrderDate)
);

在這個 Orders 表中,我們確保 ShipDate 永遠在 OrderDate 或之後。畢竟,我們不能在訂單成立之前就發貨,對吧?那會需要時間旅行,而 SQL 還沒有那麼先進...至少目前還沒有!

讓我們來測試一下:

-- 這個會成功
INSERT INTO Orders (OrderID, OrderDate, ShipDate)
VALUES (1, '2023-06-01', '2023-06-03');

-- 這個會失敗
INSERT INTO Orders (OrderID, OrderDate, ShipDate)
VALUES (2, '2023-06-01', '2023-05-31');

第一個 INSERT 沒問題,因為 ShipDate(6月3日)在 OrderDate(6月1日)之後。第二個會失敗,因為它試圖在訂單成立之前(5月31日)就發貨。我們的時間警察檢查約束抓住了這個時空的異常!

在表級別上創建檢查約束:全知之眼

有時候,我們希望創建一個涉及多列但不與任何特定列相關聯的檢查約束。我們可以通過創建一個表級別的約束來做到這點。

這是它的樣子:

CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(50),
UnitPrice DECIMAL(10,2),
DiscountedPrice DECIMAL(10,2),
CONSTRAINT CHK_Price CHECK (DiscountedPrice <= UnitPrice)
);

在這個 Products 表中,我們確保 DiscountedPrice 始終小於或等於 UnitPrice。畢竟,我們不希望我們的產品在打折後的價格反而更高!

讓我們看看它是如何運作的:

-- 這個會成功
INSERT INTO Products (ProductID, ProductName, UnitPrice, DiscountedPrice)
VALUES (1, 'Super Gadget', 99.99, 79.99);

-- 這個會失敗
INSERT INTO Products (ProductID, ProductName, UnitPrice, DiscountedPrice)
VALUES (2, 'Mega Widget', 49.99, 59.99);

第一個 INSERT 運作正常,因為 DiscountedPrice(79.99)小於 UnitPrice(99.99)。第二個會失敗,因為它試圖將 DiscountedPrice(59.99)設定得高於 UnitPrice(49.99)。我們的檢查約束讓我們免於這種定價錯誤!

在現有列上添加檢查約束:後裝

如果我們已經有一個表並且想要添加一個檢查約束怎麼辦?沒問題!我們也可以向現有的列添加約束。

以下是如何操作:

-- 首先,創建一個沒有約束的表
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
GPA DECIMAL(3,2)
);

-- 現在,添加一個檢查約束
ALTER TABLE Students
ADD CONSTRAINT CHK_GPA CHECK (GPA >= 0.0 AND GPA <= 4.0);

在這個例子中,我們添加了一個檢查約束以確保 GPA 始終在 0.0 和 4.0 之間。

讓我們來測試一下:

-- 這個會成功
INSERT INTO Students (StudentID, FirstName, LastName, GPA)
VALUES (1, 'Alice', 'Johnson', 3.75);

-- 這個會失敗
INSERT INTO Students (StudentID, FirstName, LastName, GPA)
VALUES (2, 'Bob', 'Smith', 4.5);

第一個 INSERT 運作正常,因為 3.75 在我們允許的 GPA 范圍內。第二個會失敗,因為 4.5 高於我們的最大值 4.0。我們後裝的檢查約束讓那些 GPA 保持正常!

刪除檢查約束:大逃亡

有時候,我們可能需要刪除一個檢查約束。也許是我們的業務規則已經改變,或者我們正在重構我們的數據庫。無論原因為何,SQL 給我們提供了一種方式來刪除約束。

以下是如何操作的:

-- 刪除一個命名的約束
ALTER TABLE Students
DROP CONSTRAINT CHK_GPA;

-- 刪除一個未命名的約束(SQL Server 語法)
ALTER TABLE Employees
DROP CONSTRAINT ALL;

就这样,約束就不见了!但是記住,能力越強,責任越大。在你刪除約束之前,確保你真的想要這麼做!

結論:您的數據完整性工具包

好了,各位!我們已經一起穿越了 SQL 檢查約束的土地,從單列守護者到多列哨兵,從表級別監視者到約束刪除者。

記住,檢查約束就像是您數據王國的忠實守衛。它們不知疲倦地工作,確保只有正確的數據能夠進入您的表,讓您的數據庫保持乾淨、一致和可靠。

在你繼續你的 SQL 冒險時,請將這些檢查約束放在你的工具包中。它們將成為你維護數據完整性和防止那些討厭的數據小妖精潛入的可靠夥伴!

現在,帶著信心去約束吧!快樂 SQL-ing!

方法 描述 示例
單列檢查 對單列應用條件 Age INT CHECK (Age >= 18)
多列檢查 對多列應用條件 CHECK (ShipDate >= OrderDate)
表級別檢查 在表級別應用條件 CONSTRAINT CHK_Price CHECK (DiscountedPrice <= UnitPrice)
向現有列添加檢查 向現有列添加檢查約束 ALTER TABLE Students ADD CONSTRAINT CHK_GPA CHECK (GPA >= 0.0 AND GPA <= 4.0)
刪除檢查約束 刪除現有的檢查約束 ALTER TABLE Students DROP CONSTRAINT CHK_GPA

Credits: Image by storyset