科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航



ZDNet>软件频道>数据库-zhiding>如何使用CHECK约束为SQL Server数据执行域完整性

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

你可能已经熟悉它们——你可以对一个栏应用PRIMARY KEY、NOT NULL、UNIQUE、FROEIGH KEY和CHECK这些约束。在本文中,我们将使用CHECK约束来执行业务规则,保护数据完整性。

你可能认为简单的数据错误并不特别重要,但即使一个小错误也可能造成许多破坏。例如,一个邮政编码错误似乎不是太严重——直到一位新客户的订单无法到达。

或者想象一下,如果你的最优秀的销售员收到的佣金支票只有预期的一半,他所表现出的诧异程度。无疑,错误的数据可能造成严重的后果。

约束任何域,或栏可以接受的数据,开发者帮助保证应用程序保存了适当的数据。执行域完整性仅表示某一栏只接受应用程序的业务规则所规定的有效数据。

执行数据完整性的第一个步骤是设定栏的数据类型,但你的工作并不仅限于此。你还可以使用约束决定栏内所允许的实际值。约束指定义SQL Server如何执行数据完整性的规则。

你可能已经熟悉它们——你可以对一个栏应用PRIMARY KEY、NOT NULL、UNIQUE、FROEIGH KEY和CHECK这些约束。在本文中,我们将使用CHECK约束来执行业务规则,保护数据完整性。

应用一个简单的CHECK约束

定义一个栏的数据类型是执行域完整性的第一步。例如,一个数字栏不能接受alpha字符,一个比特栏只能接受0和1这两个值,等等。设定正确的数据类型可以发现一些数据输入错误,但一般来说,它无法执行给数据施加更多限制的业务规则。

CHECK约束在设定栏数据类型之上更进了一步。它们使用一个决定数据是否有效的布尔表达式限制一个栏可以接受的实际值。例如,你可以使用CHECK约束保证佣金比例总在5%到8%之间:

commission >= .05 AND commission <= .08

如果你输入0.06这个值,CHECK表达式将返回TRUE(真)并接受这个值。否则,表达式将返回FALSE(假)并拒绝0.01这个值。

用CHECK表达式求值时,出现NULL值的情况无法预料,且CHECK也不会明确拒绝NULL值。SQL Server具有足够的灵活性,允许在同一个栏中使用几个约束。(如果你试图建立一个与现有的约束或属性相冲突的约束,SQL Server将显示错误信息。)

为说明如何使用CHECK约束限制数据,我们建立一个限制输入仅为数字的约束,即使这个栏的数据类型为字符(文本)数据类型。这种情况在保存邮政编码时经常遇到。一个字符栏接受alpha字符,但邮政编码中只包含数字。使用Management Studio和SQL Server 2005 Express Edition,我手动建立一个只允许邮政编码栏接受五个数字的约束。

我们在例子中使用的表包含两个nchar栏——ZIPCode和City栏。你可以使用任何SQL Server表,只要其中包含一个邮政编码栏即可。

  • 按照我们的例子,运行下列语句建立表:
    CREATE TABLE ZIPCodesZIPCodenchar(5), City nchar(30)
  • 在Management Studio的Object Explorer中,打开上面的表。
  • 右击Constraints(约束)并选择New Constraint(新约束)。
  • 在CHECK Constraints对话框的Expression(表达式)框中输入以下约束表达式,如A所示(仅显示一部分)。
    ZIPCode like '[0-9] [0-9] [0-9] [0-9] [0-9]'
  • 将约束命名为CK_ZIPCodes_ZIPCoce。
  • 输入一段简短的说明,如“限定邮政编码为五位数字”。
  • 点击Add(添加)然后Close(关闭)。
  • 在Standard(标准)菜单上点击Save(保存)。

图A

如何使用CHECK约束为SQL Server数据执行域完整性

CHECK约束使用一个表达式决定用户输入是否有效

你可以避开手动过程,执行一个下列格式的SQL语句(只要表已经存在):

ALTER TABLE tablename ADD CONSTRAINT constraintname CHECK (expression)

如果是上例中的表,则执行以下语句:

ALTER TABLE dbo.ZIPCodes ADD CONSTRAINT CK_ZIPCodes_ZIPCode CHECK (ZIPCode like '[0-9] [0-9] [0-9] [0-9] [0-9]')

[0-9]部分将指定位置的字符限定为0-9之间的任何数字。由于表达式重复使用了五个[0-9],表示这个约束只允许五个数字。大括号([])是你指定一组字符所用到的通配符。(欲了解约束表达式的更多信息,请查看在线手册。)

添加CHECK约束后,点击New Query(新查询)并执行以下SQL语句增加一个无效的邮政编码:

INSERT ZIPCodes (ZIPCode, City)

VALUES ('555aa', 'Smallville')

图B显示得到的结果。值555aa中包含两个违反[0-9]约束的字符。因此,SQL Server拒绝这个输入。不使用CHECK约束,SQL Server将接受555aa这个值。

图B

如何使用CHECK约束为SQL Server数据执行域完整性

CHECK约束不会接受555aa,因为其中包含alpha字符

记住,上面例子中的约束并不能保证它接受的输入确实是一个有效的邮政编码。它只能保证接受的值仅包含数字。

Susan Sales Harkins是一名独立顾问,也是数据库技术方面许多文章和书籍的作者。Mastering Microsoft SQL Server 2005 Express是她最近与Mike Gunderloy合著的作品,由Sybex出版。

她和Gunderloy合作的其它作品包括:Automating Microsoft Access 2003 with VBA、Upgrader's Guide to Microsoft Office System 2003、 ICDL Exam Cram 2和Absolute Beginner's Guide to Microsoft Access 2003,这些书籍全都由Que出版。当前,Susan是Database Advisors的义务发行总监。

责任编辑:德东

查看本文国际来源

推广二维码
邮件订阅

如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

重磅专题