《MS SQL Server 2000管理员手册》系列——16. 建立与使用默认值、条件约束及规则[1]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

16. 建立与使用默认值、条件约束及规则
默认值
条件约束
规则对象
本章总结
默认值、条件约束及规则对象皆是您可以在数据表的数据行定义中的选择性属性。在 第15章 ,曾学习了使用如何用ALTER TABLE命令替数据表新增具有默认值的数据行。本章则涵盖设立及修改默认值之方式。回顾一下,设定 默认值 (default)指的是在一没有明确设定值的数据行中,输入一明确的值。 条件约束 (constraint)则是提供了用于辨识有效数据行值的方法(为了拒绝无效的值)。本章将介绍五种类型的条件约束值及如何使用T-SQL及Microsoft SQL Server Enterprise Manager来设立和修改默认值及条件约束的方法,不过,使用Enterprise Manager会较为简单。
默认值
 
下述状况得以解释为何需要在数据表的数据行中设立默认值。例如您如果想在含有一个或多个可为NULL数据行的数据表中插入数据列,则这些数据行将会被输入为NULL值。但是如果这些数据行被定义为NOT NULL,并且于插入数据列时并未替该批数据行提供值,那么将会有一条错误讯息提醒您NULL无法被插入该批资料行中。此时默认值即可发挥其功效。默认值可在此时替代NULL值,以避免产生错误讯息。
Microsoft SQL Server 7.0允许您为数据表中的每一数据行定义一个默认值。具有timestamp数据型别或IDENTITY、ROWGUIDCOL属性的数据行不能定义默认值,因为这些数据行必须是特殊的值。 默认值 定义中指定的值也必须与数据行中的数据型别是兼容的。
有几种建立和修改默认值定义的方式。在这部份,我们首先介绍如何以T-SQL于建立数据表时定义一个默认值,以及如何透过新增或修改默认值来修改数据行;之后则会介绍以Enterprise Manager来执行相同的工作。在 第15章 里我们曾介绍如何替数据表新增有默认值的数据行,以及此数据行对数据表中现存的数据列所产生的影响。在此,我们将提供一范例以详述可用的选项及新增默认值对数据表中现存数据行的影响。
使用T-SQL来定义和修改默认值
 
您可以用下列三项陈述式之一为数据行定义默认值:CREATE TABLE、ALTER TABLE或CREATE DEFAULT。SQL Server 2000使用CREATE DEFAULT来建立 预设 对象,保持向后兼容性。使用这种方式时,SQL Server把数据表和对象分开储存,因此必须透过系统预存程序sp_bindefault把对象系结到数据表上。删除数据表时,DEFAULT定义自动从数据表中解除系结,但是 预设 对象仍然存在。在使用CREATE TABLE或ALTER TABLE时,SQL Server会把 预设 对象定义和数据表一同储存,如果数据表被删除,预设对象也会自动被删除,而不须再采取其它操作步骤。因此,通常不建议使用CREATE DEFAULT。然而,当对多个数据行使用相同的默认值时,使用 预设 对象也可能会带来好处。
当执行T-SQL时,应使用SQL Query Analyzer,因其执行结果可显示在使用者图形接口上。此项功能比在命令窗口内执行更方便使用者阅读。
使用CREATE TABLE建立默认值
 
使用CREATE TABLE命令在数据行中建立默认值是较常用的标准技巧。以下的陈述式在MyDB中建立一有默认值的数据表,并同时定义了两个数据行:A数据行为char类型;B数据行为int类型。
USE MyDB
CREATE TABLE MyTABLE
(
columnA  char(15)  NULL DEFAULT 'n/a',
columnB  int NULL  DEFAULT 0
)
GO
columnA中的默认值n/a与该数据行的char数据型别兼容;相同的,columnB中的默认值0和该数据行的int数据型别兼容。如果我们在数据表中插入一数据列而没有为columnA及columnB的两个数据行指定数值,则默认值会被自动取用。所以若要该数据行保持NULL,则要明白表示要插入NULL值。因为此两数据行皆可包含NULL值,所以欲插入NULL值是被允许的。但若数据行定义为NOT NULL,则不能插入NULL值。
使用ALTER TABLE修改默认值
 
使用ALTER TABLE命令可以修改数据行中的默认值定义或新增一数据行。若要更改已经定义的默认值数据行,首先必须删除已经有的默认值,然后新增一个新的默认值(若您使用的是Enterprise Manager就会较为简单,因为使用Enterprise Manager就不需执行删除的步骤)。
如果用CREATE TABLE命令建立未命名的默认值,或使用Enterprise Manager(将在本章后面部份介绍),SQL Server将自动替默认值命名。要知道SQL Server为默认值分配了什么名字,以便可以使用T-SQL删除它,您可执行sp_help程序如下:
USE MyDB
GO
sp_help MyTable
GO
所有MyTable的默认值名称皆列示在图16-1中的constraint_name资料行下面:

 
 
图16-1 sp_help程序的输出
假设我们要把columnA的默认值从n/a改成not applicable。记住首先必须删除存在的默认值然后再新增一个新的。下述命令即可删除默认值:
ALTER TABLE MyTable
DROP CONSTRAINT DF_MyTable_columnA_2B3F6F97
现在您可以使用下述命令新增一个默认值,这次由我们自己命名,:
ALTER TABLE MyTable
ADD CONSTRAINT DF_MyTable_columnA
DEFAULT "Not applicable" FOR columnA
GO
当变更已存在的默认值时,所有现存的列将保持原始的默认值。只有新插入的列会使用新的默认值。
如 第15章 所述,您也可以用ALTER TABLE命令为已有的数据表新增完整的新数据行,如下所示:
ALTER TABLE MyTable
ADD columnC tinyint NOT NULL DEFAULT 13
GO
现在MyTable范例数据表已新增了数据行columnC数据行,其默认值为13。因为columnC是定义为NOT NULL的新数据行,数据表中现存数据行的新数据行将会被分配为默认值13。
如果新数据行允许被设定为NULL值,数据表中现存数据行的新数据行则会被分配为NULL值。若我们希望用默认值而不是NULL插入已存在的列,则应该使用DEFAULT中的WITH VALUES选项,如下所示:
ALTER TABLE MyTable
ADD columnC tinyint NULL DEFAULT 13 WITH VALUES
GO
WITH VALUES命令会强行使MyTable中所有现存列的新数据行接受默认值13来代替原来的NULL值。
现在,我们已经学习了如何建立与数据表储存在一起的DEFAULT定义。下面我们将学习如何用CREATE DEFAULT来建立一个和数据表分开储存的 预设 对象。
CREATE DEFAULT和sp_bindefault
 
您还可以使用T-SQL CREATE DEFAULT命令来建立Default对象,进而新增或修改现存数据行的默认值。建立默认值对象后,使用系统预存程序sp_bindefault可以把它系结至数据行或系结至使用者自订的数据型别上。如前所述,在SQL Server 2000中保留这种方法的目的是为了向后兼容性,因此它不是很好的方法。但是,如果要在不同的数据表中使用相同的默认值数据行,此方法则较为有效。
下面介绍一个例子,使用CREATE DEFAULT来建立名称为DF_not_applicable的默认值对象,其值为n/a。在MyDB数据库中建立该 预设 对象,并系结至MyTable的columnA上(假定数据表中现在不存在默认值)。使用CREATE DEFAULT的语法如下:
CREATE DEFAULT default_name AS constant_expression
sp_bindefault的语法如下:
sp_bindefault 'default_name' table.column | user_defined_datatype
[", futureonly"]
参数default_name是 预设 对象的名称。Table.column是指定要分配预设对象的数据行。
下面的T-SQL陈述式能建立范例的预设对象,并把它系结至MyTable的columnA上:
USE MyDB
GO
CREATE DEFAULT DF_not_applicable AS 'n/a'
GO
sp_bindefault "DF_not_applicable", "MyTable.columnA"
GO
如果columnA中已经存在默认值,执行sp_bindefault时,SQL Server将传回一条错误讯息,通知您不能系结 预设 对象到已经具有默认值的数据行上。您首先须删除原默认值,然后把新的预设对象系结至该数据行上(使用DROP DEFAULT删除预设对象的过程将在本节后面介绍)。
您还可以建立一预设对象并将此对象与使用者自订数据型别系结起来。系结预设对象到使用者自订数据型别时,您可以使用sp_bindefault的futureonly选项。这一选项防止现存的使用者自订型别数据行接受这个新的默认值,而只有新建立的使用者自订型别的数据行才能接受其相关联的默认值。如果没有指定futureonly,SQL Server将默认值系结到所有已经存在的和新建立的使用者自订类型的数据行上。
例如,让我们建立一个名称为area_code的使用者自订型别和名称为DF_area_code的默认值对象,其值为786;然后系结默认值到该使用者自订数据型别上(使用者自订数据型别的建立在 第10章 介绍过)。因为这是新的使用者自订数据型别,因此目前还没有数据行,也就不需要futureonly选项,但我们依然保留它,因为保留它不会有什么影响。该陈述式将如下所示:
sp_addtype "area_code", "char(3)", "NOT NULL"
GO
CREATE DEFAULT DF_area_code AS 786
GO
sp_bindefault "DF_area_code", "area_code", "futureonly"
GO
要检视 预设 对象的数据型别,可使用sp_help系统程序,如图16-2所示。

本文关键:《MS SQL Server 2000管理员手册》系列——16. 建立与使用默认值、条件约束及规则
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top