SQL CHECK:检查性约束

 
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。