约束通过对列中的数据添加一定条件来提供额外的数据完整性。每当操纵(插入,删除或更新)值时,都会检查约束并拒绝违反约束的修改。

例如Unique约束,要求同一列中的每个值都与其他值不同(除了NULL值)。如果你企图添加重复的值,该约束会拒绝整个语句。

支持的约束

Constraint Description
Check 对于布尔表达式,值必须返回TRUENULL
Default Value 如果insert语句中在该列没有设置值,则将该字段值设置为Default Value配置的默认值。
Foreign Keys 值必须与它引用的列中的现有值完全匹配。
Not Null 值不能为NULL。
Primary Key 该列的值在表中必须唯一,表现相当于应用了Not Null约束和Unique约束,并且使用该列自动为表创建索引。
Unique 每个非NULL值必须是唯一的,这也会使用该列自动为表创建索引。

使用约束

添加约束

添加约束的方式取决于要约束的列数,以及表是否为新表。

> CREATE TABLE foo (a INT PRIMARY KEY);
> CREATE TABLE bar (a INT, b INT, PRIMARY KEY (a,b));

Default Value和Not Null约束不能应用于多个列。

> ALTER TABLE baz ADD CONSTRAINT id_unique UNIQUE (id);
> ALTER TABLE baz ALTER COLUMN bool SET DEFAULT true;

约束顺序

约束的顺序并不重要,因为约束将应用于其各自表或列的每个修改。

在新表为约束命名

在定义约束之前,可以使用CONSTRAINT子句命名新表的约束:

> CREATE TABLE foo (a INT CONSTRAINT another_name PRIMARY KEY);

> CREATE TABLE bar (a INT, b INT, CONSTRAINT yet_another_name PRIMARY KEY (a,b));

查看约束

使用 SHOW CONSTRAINTSSHOW CREATE TABLE查看表的约束信息。

删除约束

删除约束的过程取决于其类型:

Constraint Type Procedure
Check 使用 DROP CONSTRAINT
Default Value 使用 ALTER COLUMN
Foreign Keys 使用 DROP CONSTRAINT
Not Null 使用 ALTER COLUMN
Primary Key 无法删除Primary Key约束。 但是,你可以将表的数据移动到新表。
Unique 无法直接删除Unique约束,但是,您可以使用DROP INDEX删除由Unique约束(其名称以_key结尾)自动创建的索引,以删除约束。

修改约束

修改约束的过程取决于它的类型:

Constraint Type Procedure
Check 发出添加新Check事件约束(ADD CONSTRAINT)的事务,然后删除现有事务(DROP CONSTRAINT)。
Default Value 可以通过ALTER COLUMN修改
Foreign Keys 发出添加新外键约束(ADD CONSTRAINT)的事务,然后删除现有约束(DROP CONSTRAINT)。
Not Null Not Null约束不能更改,只能删除。 但是,你可以将表的数据移动到新表。
Primary Key Primary Keys约束不能被修改,但是,你可以将表的数据移动到新表。
Unique 发出添加新Unique约束(ADD CONSTRAINT)的事务,然后删除现有约束(DROP CONSTRAINT)。

表迁移以添加或更改不可变约束

如果要更改不可变约束,可以使用以下过程:

  1. 创建新表 并添加新的约束
  2. 使用 INSERT from a SELECT statement将数据从旧表移到新表
  3. 删除旧表, 然后 将新表重命名为原表的名字. 这不能以事务方式完成。

See Also