SQL檢查約束
在本教程中,將學習如何使用SQL CHECK
約束來驗證基於布爾表達式的列或一組列中的數據。
1. 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
約束。
2. SQL CHECK約束示例
下面來看一些創建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
約束來基於布爾表達式驗證數據。