SQL檢查約束

在本教程中,將學習如何使用SQL CHECK約束來驗證基於布爾表達式的列或一組列中的數據。

1. SQL CHECK約束簡介

CHECK約束是SQL中的完整性約束,它允許指定列或列集中的值必須滿足布爾表達式。

可以在單個列或整個表上定義CHECK約束。 如果在單個列上定義CHECK約束,則CHECK約束僅檢查此列的值。 但是,如果在表上定義CHECK約束,則會根據同一行的其他列中的值限制列中的值。

CHECK約束由關鍵字CHECK後跟括號中的布爾表達式組成:

CHECK(Boolean_expression)

如果要爲CHECK約束指定名稱,請使用以下語法:

CONSTRAINT constraint_name CHECK(Boolean_expression)

值得注意的是,當布爾表達式返回trueNULL值時,視爲滿足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_pricecost列相關聯的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約束來基於布爾表達式驗證數據。