SQL CHECK:检查性约束

1年前 (2024-04-26)
SQL CHECK 约束(检查性约束)用来限制字段的取值范围。您可以在 CHECK 约束中添加限制条件,只有满足这些条件的值才允许进入该字段。

您可以为一个字段或者多个字段定义 CHECK 约束。

示例

创建一个名为 website 的新表,该表包含七个字段,我们为 age 字段添加 CHECK 约束,要求网站年龄不大于 25 岁。代码如下:

CREATE TABLE website (

id INT NOT NULL AUTO_INCREMENT,

name VARCHAR(20) NOT NULL,

url VARCHAR(30),

age TINYINT UNSIGNED NOT NULL CHECK(age<=25),

alexa INT UNSIGNED NOT NULL,

uv FLOAT DEFAULT '0',

country CHAR(3) NOT NULL ,

PRIMARY KEY (id)

);


其它一些常见用法:

  • 规定体重必须大于 0 并且小于 100 公斤:

    weight NUMERIC(9, 2) CHECK( weight>0 AND weight<=100 )

  • 规定性别只能是男(male)和女(female):

    sex CHAR(6) CHECK( sex='male' OR sex='female' )


当然,您也可以为多个字段添加 CHECK 约束。例如,在创建 website 表时,规定网站年龄不大于 25 岁,并且 Alexa 排名不能高于 10000,如下所示:

CREATE TABLE website (

id INT NOT NULL AUTO_INCREMENT,

name VARCHAR(20) NOT NULL,

url VARCHAR(30),

age TINYINT UNSIGNED NOT NULL CHECK(age<=25),

alexa INT UNSIGNED NOT NULL CHECK(alexa<=10000),

uv FLOAT DEFAULT '0',

country CHAR(3) NOT NULL ,

PRIMARY KEY (id)

);

或者写作:

CREATE TABLE website (

id INT NOT NULL AUTO_INCREMENT,

name VARCHAR(20) NOT NULL,

url VARCHAR(30),

age TINYINT UNSIGNED NOT NULL,

alexa INT UNSIGNED NOT NULL,

uv FLOAT DEFAULT '0',

country CHAR(3) NOT NULL ,

PRIMARY KEY (id),

CONSTRAINT myCheck CHECK(age<=25 AND alexa<=10000)

);

myCheck 为自定义的约束名字。

如果您已经创建了 website 表,并且希望向 age 字段添加约束,则可以使用下面的语句:

ALTER TABLE website

MODIFY age TINYINT UNSIGNED NOT NULL CHECK(age<=25);


如果您希望给多个字段添加约束,可以使用下面的语法:

ALTER TABLE website

ADD CONSTRAINT myCheck CHECK(age<=25 AND alexa<=10000);

删除约束

要想删除 CHECK 约束,请使用下面的语法:

ALTER TABLE website

DROP CONSTRAINT myCheck;

myCheck 是自定义的约束名字。注意,该语法不适用于 MySQL。