你可能认为简单的数据错误并不特别重要,但即使一个小错误也可能造成许多破坏。例如,一个邮政编码错误似乎不是太严重——直到一位新客户的订单无法到达。 SW.ofZT
你可能认为简单的数据错误并不特别重要,但即使一个小错误也可能造成许多破坏。例如,一个邮政编码错误似乎不是太严重——直到一位新客户的订单无法到达。 SW.ofZT
/5(-C_EE
或者想象一下,如果你的最优秀的销售员收到的佣金支票只有预期的一半,他所表现出的诧异程度。无疑,错误的数据可能造成严重的后果。 'mT I %
MgB`U[p>
约束任何域,或栏可以接受的数据,开发者帮助保证应用程序保存了适当的数据。执行域完整性仅表示某一栏只接受应用程序的业务规则所规定的有效数据。 !"l: #|<P
/i2^XM!
执行数据完整性的第一个步骤是设定栏的数据类型,但你的工作并不仅限于此。你还可以使用约束决定栏内所允许的实际值。约束指定义SQL Server如何执行数据完整性的规则。 E' cx:G
G@ H,A\e
你可能已经熟悉它们——你可以对一个栏应用PRIMARY KEY、NOT NULL、UNIQUE、FROEIGH KEY和CHECK这些约束。在本文中,我们将使用CHECK约束来执行业务规则,保护数据完整性。 (s+L=^
$S?CUs;q
应用一个简单的CHECK约束 9aHfk0g`
{In"r ^~]
定义一个栏的数据类型是执行域完整性的第一步。例如,一个数字栏不能接受alpha字符,一个比特栏只能接受0和1这两个值,等等。设定正确的数据类型可以发现一些数据输入错误,但一般来说,它无法执行给数据施加更多限制的业务规则。 n.&]_96i
]4V?Z,p*
CHECK约束在设定栏数据类型之上更进了一步。它们使用一个决定数据是否有效的布尔表达式限制一个栏可以接受的实际值。例如,你可以使用CHECK约束保证佣金比例总在5%到8%之间: V TlI
e51J;m
commission >= .05 AND commission <= .08 W2D%G':GN
kJ#4p#J
如果你输入0.06这个值,CHECK表达式将返回TRUE(真)并接受这个值。否则,表达式将返回FALSE(假)并拒绝0.01这个值。 h\I 9Oo0>
Qv1:Az;O4
用CHECK表达式求值时,出现NULL值的情况无法预料,且CHECK也不会明确拒绝NULL值。SQL Server具有足够的灵活性,允许在同一个栏中使用几个约束。(如果你试图建立一个与现有的约束或属性相冲突的约束,SQL Server将显示错误信息。) b YSj\Jc
rL[l)N2
为说明如何使用CHECK约束限制数据,我们建立一个限制输入仅为数字的约束,即使这个栏的数据类型为字符(文本)数据类型。这种情况在保存邮政编码时经常遇到。一个字符栏接受alpha字符,但邮政编码中只包含数字。使用Management Studio和SQL Server 2005 Express Edition,我手动建立一个只允许邮政编码栏接受五个数字的约束。