CHECK 约束
CHECK 约束通过限制输入到列中的值来强制域的完整性。这与 FOREIGN KEY 约束控制列中数值相似。区别在于它们如何判断哪些值有效:FOREIGN KEY 约束从另一个表中获得有效数值列表,CHECK 约束从逻辑表达式判断而非基于其它列的数据。例如,通过创建 CHECK 约束可将 salary 列的取值范围限制在 $15,000 至 $100,000 之间,从而防止输入的薪金值超出正常的薪金范围。
可以通过任何基于逻辑运算符返回结果 TRUE 或 FALSE 的逻辑(布尔)表达式来创建 CHECK 约束。对上例,逻辑表达式为:
salary >= 15000 AND salary <= 100000
对单独一列可使用多个 CHECK 约束。按约束创建的顺序对其取值。通过在表一级上创建 CHECK 约束,可以将该约束应用到多列上。例如,多列 CHECK 约束可以用来判明 country 列值为 USA 且 state 列值为两个字母值所对应的行。这样就允许在一处同时检查多个条件。
创建和修改 CHECK 约束
CHECK 约束可以:
- 作为表定义的一部分在创建表时创建。
- 添加到现有表中。表和列可以包含多个 CHECK 约束。
- 修改或删除现有的 CHECK 约束。例如,可以修改表中列的CHECK 约束的表达式。
说明 若要使用 Transact-SQL 或 SQL-DMO修改 CHECK 约束,必须首先删除已有的 CHECK 约束,然后再通过新定义重新创建。
在现有表中添加 CHECK 约束时,该约束可以仅作用于新数据也可以同时作用于现有的数据。默认设置为 CHECK 约束同时作用于现有数据和新数据。当现有数据已符合新的 CHECK 约束,或业务规则要求从此开始强制约束时,使用约束仅作用于新数据选项比较有用。
例如,旧约束要求邮政编码为 5 位,而新约束要求为 9 位。5 位的旧邮政编码依然有效并与 9 位的新邮政编码共存。因此,只须对新邮政编码按新的约束进行检验。
不过,添加约束而不检查现有数据时一定要小心,因为这样做将放弃 Microsoft® SQL Server™ 2000 对表强制完整性规则的控制。
禁用 CHECK 约束
下列情况可以禁用现有 CHECK 约束:
- INSERT 和 UPDATE 语句,以允许不经约束确认修改表中的数据。在执行 INSERT 和 UPDATE 语句时,如果新数据违反约束或约束应只适用于数据库中已有的数据,那么可禁用 CHECK 约束。
- 复制处理。如果该约束为源数据库所特有,则在复制时请禁用 CHECK 约束。复制表时,表定义和数据从源数据库复制到目标数据库。这两个数据库通常(但不一定)在不同的服务器上。如果源数据库特有的 CHECK 约束在复制时未禁用,则可能无谓地妨碍向目标数据库输入新数据。
删除 CHECK 约束以取消对约束表达式所包含列在接受数据时的限制。
修改 CHECK 约束
当要更改约束 表达式 ,或更改对特定条件启用或禁用约束的选项时,修改 CHECK 约束 。
修改 CHECK 约束
- 在数据库关系图中右击包含约束的表,然后从快捷菜单中选择"属性"命令。
-或-
为包含约束的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择"属性"命令。
- 选择"CHECK 约束"选项卡。
- 从"选定的约束"列表中,选择要更改的约束。
- 完成下表中的操作:
若要 遵循下列步骤 编辑约束表达式 在"约束表达式"框中,键入新的表达式。有关详细信息,请参见定义 CHECK 约束表达式。 重命名约束 在"约束名"框中,键入新的名称。 将约束应用到现有数据 选择"创建中检查现存数据"选项。有关详细信息,请参见创建 CHECK 约束时检查现有数据。 当将新数据添加到表中或更新表中的现有数据时禁用约束 清除"对 INSERT 和 UPDATE 强制约束"选项。有关详细信息,请参见对 INSERT 和 UPDATE 语句禁用 CHECK 约束。 当在另一个数据库中复制表时禁用约束 清除"对复制强制约束"选项。有关详细信息,请参见对复制禁用 CHECK 约束。
当保存表或关系图时,约束即在数据库内被更新。
定义 CHECK 约束表达式
当将 CHECK 约束 附加到表或列时,必须包括 SQL 表达式。有关该操作的详细信息,请参见将新的 CHECK 约束附加到表或列。
可以创建简单的约束表达式在简单条件下检查数据;或使用布尔运算符创建复杂的约束表达式以在多种条件下检查数据。例如,假设 authors
表中有一个 zip
列,该列要求 5 位数字的字符串。下面的示例约束表达式确保只允许 5 位数字:
zip LIKE '[0-9][0-9][0-9][0-9][0-9]'
或者假设 sales
表中有一个名为 qty
的列,该列要求大于 0 的值。下面的示例约束确保只允许正值:
qty > 0
或者假设 orders
表限制所有信用卡订单可接受的信用卡类型。下面的示例约束确保如果用信用卡发出订单,则只接受 Visa、MasterCard 或 American Express:
NOT (payment_method = 'credit card') OR
(card_type IN ('VISA', 'MASTERCARD', 'AMERICAN EXPRESS'))
定义约束表达式
- 创建新的 CHECK 约束。有关如何执行该操作的详细信息,请参见将新的 CHECK 约束附加到表或列。
- 在属性页的"CHECK 约束"选项卡中,使用下列语法在"约束表达式"框中键入表达式:
{constant | column_name | function | (subquery)}
[{operator | AND | OR | NOT}
{constant | column_name | function | (subquery)}...]SQL 语法由下列参数组成:
参数 描述 constant 字面值,如数字或字符数据。字符数据必须用单引号 ( '
) 括起来。column_name 指定列。 function 内置函数。 operator 算术运算符、位运算符、比较运算符或字符串运算符。 AND 在布尔表达式中用于连接两个表达式。当两个表达式均为真时才返回结果。 当一个语句中同时使用 AND 和 OR 时,先处理 AND。可以使用括号更改执行顺序。
OR 在布尔表达式中用于连接两个或更多条件。只要条件中有一个为真就返回结果。 当一个语句中同时使用 AND 和 OR 时,在 AND 之后再计算 OR。可以使用括号更改执行顺序。
NOT 用于求反任何布尔表达式(可以包含关键字,如 LIKE、NULL、BETWEEN、IN 和 EXISTS)。 当在一个语句中使用多个逻辑运算符时,先处理 NOT。可以使用括号更改执行顺序。
将新的 CHECK 约束附加到表或列
将 CHECK 约束 附加到表以指定一列或多列中可接受的数据值。
附加新的 CHECK 约束
- 在数据库关系图中,右击包含约束的表,然后从快捷菜单中选择"约束"命令。
-或-
为将包含约束的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择"约束"命令。
- 选择"新建"命令。"选定的约束"框显示由系统分配的新约束名。系统分配的名称以"CK_"开始,后跟表名。
- 在"约束表达式"框中,为 CHECK 约束键入 SQL 表达式。例如,若要将
authors
表中state
列的输入项限制为 New York,请键入:state = 'NY'
或者,若要要求
zip
列中的输入项为 5 位数字,请键入:zip LIKE '[0-9][0-9][0-9][0-9][0-9]'
注意 确保将任何非数字约束值用单引号 (') 括起来。有关更多信息,请参见定义 CHECK 约束表达式。
- 若要给约束提供一个不同的名称,请在"约束名"框中键入名称。
- 用复选框控制何时强制约束:
- 若要在创建约束前对现有数据测试约束,请选中"创建中检查现存数据"复选框。
- 若要在该表中发生复制操作时强制约束,请选中"对复制强制约束"复选框。
- 若要在该表中插入或更新行时强制约束,请选中"对 INSERT 和 UPDATE 强制约束"复选框。
创建 CHECK 约束时检查现有数据
当创建 CHECK 约束时,可以设置选项将约束只应用于新数据或同时也应用于现有数据。当知道现有数据已满足新 CHECK 约束时,或者当业务规则要求仅从这点开始强制约束时,这种使约束仅应用于新数据的选项很有用。
例如,过去可能要求邮政编码必须是五位数字,但现在却需要新数据允许有九位邮政编码。包含五位邮政编码的旧数据将与包含九位邮政编码的新数据共存。
创建 CHECK 约束时检查现有数据
- 在数据库关系图中右击包含约束的表,然后从快捷菜单中选择"属性"命令。
-或-
为包含约束的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择"属性"命令。
- 选择"CHECK 约束"选项卡。
- 从"选定的约束"列表中选择约束。
- 选择"创建中检查现存数据"复选框。默认情况下选择该选项。
当保存表或数据库关系图时,将应用 CHECK 约束。如果在保存过程中遇到任何违反约束的行为,则不能保存表。
对 INSERT 和 UPDATE 语句禁用 CHECK 约束
当在 表 中添加、更新或删除数据时,可以禁用 CHECK 约束。禁用约束使您能够执行下列事务:
- 如果表中的现有行过去必须遵从的特定业务规则已不再适用,则可以向该表添加新的数据 行 (使用 INSERT 语句)。例如,过去可能要求邮政编码必须是五位数字,但现在却需要新数据允许有九位邮政编码。包含五位邮政编码的旧数据将与包含九位邮政编码的新数据共存。
- 如果表中的现有行过去必须遵从的特定业务规则已不再适用,则可以修改现有行(使用 UPDATE 语句)。例如,可能需要将所有现有的五位邮政编码更新为九位邮政编码。
如果知道新数据将违反约束,或者约束仅适用于数据库中的已有数据,则选择该选项以在 INSERT 和 UPDATE 事务处理期间禁用 CHECK 约束。
对 INSERT 和 UPDATE 语句禁用 CHECK 约束
- 在数据库关系图中右击包含约束的表,然后从快捷菜单中选择"属性"命令。
-或-
为包含约束的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择"属性"命令。
- 选择"CHECK 约束"选项卡。
- 从"选定的约束"列表中选择约束。
- 清除"对 INSERT 和 UPDATE 强制约束"复选框。
可以在添加或修改数据后选择该选项,以确保约束能应用到后续的数据修改中。
对复制禁用 CHECK 约束
当在另一个数据库中复制 表 时,可以禁用 CHECK 约束。复制表时,表定义和数据从源数据库复制到目的数据库。这两个数据库通常(但不一定)位于不同的服务器上。如果 CHECK 约束仅针对源数据库,则可能会不必要地阻止新数据输入到目的数据库。当在远程站点上复制数据库时,不应重新应用 CHECK 约束,因为:
- 数据在被输入原始数据库时将进行完整性检查。
- 如果数据违反 CHECK 约束,复制将失败。
对复制禁用 CHECK 约束
- 在数据库关系图中右击包含约束的表,然后从快捷菜单中选择"属性"命令。
-或-
为包含约束的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择"属性"命令。
- 选择"CHECK 约束"选项卡。
- 从"选定的约束"列表中选择约束。
- 清除"对复制强制约束"复选框。