在本教學中,將學習如何使用SQL CHECK
約束來驗證基於布林表示式的列或一組列中的資料。
CHECK
約束是SQL中的完整性約束,它允許指定列或列集中的值必須滿足布林表示式。
可以在單個列或整個表上定義CHECK
約束。 如果在單個列上定義CHECK
約束,則CHECK
約束僅檢查此列的值。 但是,如果在表上定義CHECK
約束,則會根據同一行的其他列中的值限制列中的值。
CHECK
約束由關鍵字CHECK
後跟括號中的布林表示式組成:
CHECK(Boolean_expression)
如果要為CHECK
約束指定名稱,請使用以下語法:
CONSTRAINT constraint_name CHECK(Boolean_expression)
值得注意的是,當布林表示式返回true
或NULL
值時,視為滿足CHECK
約束。 如果其中一個運算元為NULL
,則布林表示式求值為NULL
,它們不會阻止約束列儲存NULL
值。 若要確保該列不包含NULL
值,請使用NOT NULL
約束。
下面來看一些建立CHECK
約束的例子。
要建立一個products
表,其products_price
列中的值必須為正數,請使用以下CREATE TABLE
語句:
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(255) NOT NULL,
selling_price NUMERIC(10,2) CHECK (selling_price > 0)
);
CHECK
約束位於列的資料型別之後。 如果使用負值插入或更新售價,則表達sell_price> = 0
將返回false
,並且RDMBS將返回錯誤。
可以為CHECK
約束指定單獨的名稱。 約束名稱可幫助明確RDBMS返回的錯誤訊息,並確切地知道該值違反了哪個約束。
要為約束指定名稱,請使用CONSTRAINT
關鍵字,後跟約束的名稱。
例如,以下語句將positive_selling_price
指定為sell_price
列上的CHECK
約束的名稱。
分配CHECK
約束名稱的語法如下:
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(255) NOT NULL,
selling_price NUMERIC(10,2) CONSTRAINT positive_selling_price CHECK (selling_price > 0)
);
可以定義參照多個列的CHECK
約束。假設在product
表中儲存了銷售價格和成本,並且希望確保成本始終低於銷售價格。
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR (255) NOT NULL,
selling_price NUMERIC (10, 2) CHECK (selling_price > 0),
cost NUMERIC (10, 2) CHECK (cost > 0),
CHECK (selling_price > cost)
);
首先,有兩個與sell_price
和cost
列相關聯的CHECK
約束,以確保每列中的值為正。
其次,有另一個未附加到任何列的CHECK
約束,而是顯示為CREATE TABLE
語句中的最後一個子句。
前兩個約束是列約束,而第三個約束是表約束。 表約束不與任何列關聯。使用以下語法為表約束指定名稱。
CREATE TABLE table_name (
…,
CONSTRAINT check_constraint_name CHECK (Boolean_expression)
);
例如,以下語句為上面的CHECK
約束指定了一個名稱。
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR (255) NOT NULL,
selling_price NUMERIC (10, 2) CHECK (selling_price > 0),
cost NUMERIC (10, 2) CHECK (cost > 0),
CONSTRAINT valid_selling_price CHECK (selling_price > cost)
);
在本教學中,我們介紹了CHECK
約束的一些概念,並演示如何使用CHECK
約束來基於布林表示式驗證資料。