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約束來基於布林表示式驗證資料。