在本教程中,将学习如何使用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
约束来基于布尔表达式验证数据。