表CHECK 约束

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 约束

  1. 在数据库关系图中右击包含约束的表,然后从快捷菜单中选择"属性"命令。

    -或-

    为包含约束的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择"属性"命令。

  2. 选择"CHECK 约束"选项卡。
  3. 从"选定的约束"列表中,选择要更改的约束。
  4. 完成下表中的操作:
    若要遵循下列步骤
    编辑约束表达式在"约束表达式"框中,键入新的表达式。有关详细信息,请参见定义 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'))

定义约束表达式

  1. 创建新的 CHECK 约束。有关如何执行该操作的详细信息,请参见将新的 CHECK 约束附加到表或列。
  2. 在属性页的"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 约束

  1. 在数据库关系图中,右击包含约束的表,然后从快捷菜单中选择"约束"命令。

    -或-

    为将包含约束的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择"约束"命令。

  2. 选择"新建"命令。"选定的约束"框显示由系统分配的新约束名。系统分配的名称以"CK_"开始,后跟表名。
  3. 在"约束表达式"框中,为 CHECK 约束键入 SQL 表达式。例如,若要将 authors 表中 state 列的输入项限制为 New York,请键入:
    state = 'NY'

    或者,若要要求 zip 列中的输入项为 5 位数字,请键入:

    zip LIKE '[0-9][0-9][0-9][0-9][0-9]'

    注意 确保将任何非数字约束值用单引号 (') 括起来。有关更多信息,请参见定义 CHECK 约束表达式。

  4. 若要给约束提供一个不同的名称,请在"约束名"框中键入名称。
  5. 用复选框控制何时强制约束:
    • 若要在创建约束前对现有数据测试约束,请选中"创建中检查现存数据"复选框。
    • 若要在该表中发生复制操作时强制约束,请选中"对复制强制约束"复选框。
    • 若要在该表中插入或更新行时强制约束,请选中"对 INSERT 和 UPDATE 强制约束"复选框。

 

创建 CHECK 约束时检查现有数据

当创建 CHECK 约束时,可以设置选项将约束只应用于新数据或同时也应用于现有数据。当知道现有数据已满足新 CHECK 约束时,或者当业务规则要求仅从这点开始强制约束时,这种使约束仅应用于新数据的选项很有用。

例如,过去可能要求邮政编码必须是五位数字,但现在却需要新数据允许有九位邮政编码。包含五位邮政编码的旧数据将与包含九位邮政编码的新数据共存。

创建 CHECK 约束时检查现有数据

  1. 在数据库关系图中右击包含约束的表,然后从快捷菜单中选择"属性"命令。

    -或-

    为包含约束的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择"属性"命令。

  2. 选择"CHECK 约束"选项卡。
  3. 从"选定的约束"列表中选择约束。
  4. 选择"创建中检查现存数据"复选框。默认情况下选择该选项。

当保存表或数据库关系图时,将应用 CHECK 约束。如果在保存过程中遇到任何违反约束的行为,则不能保存表。

对 INSERT 和 UPDATE 语句禁用 CHECK 约束

当在 表 中添加、更新或删除数据时,可以禁用 CHECK 约束。禁用约束使您能够执行下列事务:

  • 如果表中的现有行过去必须遵从的特定业务规则已不再适用,则可以向该表添加新的数据 行 (使用 INSERT 语句)。例如,过去可能要求邮政编码必须是五位数字,但现在却需要新数据允许有九位邮政编码。包含五位邮政编码的旧数据将与包含九位邮政编码的新数据共存。
  • 如果表中的现有行过去必须遵从的特定业务规则已不再适用,则可以修改现有行(使用 UPDATE 语句)。例如,可能需要将所有现有的五位邮政编码更新为九位邮政编码。

如果知道新数据将违反约束,或者约束仅适用于数据库中的已有数据,则选择该选项以在 INSERT 和 UPDATE 事务处理期间禁用 CHECK 约束。

对 INSERT 和 UPDATE 语句禁用 CHECK 约束

  1. 在数据库关系图中右击包含约束的表,然后从快捷菜单中选择"属性"命令。

    -或-

    为包含约束的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择"属性"命令。

  2. 选择"CHECK 约束"选项卡。
  3. 从"选定的约束"列表中选择约束。
  4. 清除"对 INSERT 和 UPDATE 强制约束"复选框。

    可以在添加或修改数据后选择该选项,以确保约束能应用到后续的数据修改中。

 

对复制禁用 CHECK 约束

当在另一个数据库中复制 表 时,可以禁用 CHECK 约束。复制表时,表定义和数据从源数据库复制到目的数据库。这两个数据库通常(但不一定)位于不同的服务器上。如果 CHECK 约束仅针对源数据库,则可能会不必要地阻止新数据输入到目的数据库。当在远程站点上复制数据库时,不应重新应用 CHECK 约束,因为:

  • 数据在被输入原始数据库时将进行完整性检查。
  • 如果数据违反 CHECK 约束,复制将失败。

对复制禁用 CHECK 约束

  1. 在数据库关系图中右击包含约束的表,然后从快捷菜单中选择"属性"命令。

    -或-

    为包含约束的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择"属性"命令。

  2. 选择"CHECK 约束"选项卡。
  3. 从"选定的约束"列表中选择约束。
  4. 清除"对复制强制约束"复选框。  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值