SQL 约束语句:外键、检查及默认

日期: 2013-11-27 作者:Robert Sheldon翻译:Ranma 来源:TechTarget中国 英文

这是关于在SQL Server中各种SQL约束语句的第二部分。本文涵盖了外键,检查以及默认约束,而第一部分介绍了主键和唯一约束。 一个外键SQL约束与一个表中的一个或多个字段相关联,而这些字段是与另一个表中的字段相对应的,这样的表称之为引用表。一个外键字段可以只包含引用字段中也包含的数据。

例如,假设我们在AdventureWorks数据库中创建了自己的SpecialtyProducts表。接着我们便可以在引用了Sales.Store 表中BusinessEntityID 字段的StoreID字段上创建一个外键约束。结果就是,StoreID字段能够只包含BusinessEntityID字段中存在……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

这是关于在SQL Server中各种SQL约束语句的第二部分。本文涵盖了外键,检查以及默认约束,而第一部分介绍了主键和唯一约束。

一个外键SQL约束与一个表中的一个或多个字段相关联,而这些字段是与另一个表中的字段相对应的,这样的表称之为引用表。一个外键字段可以只包含引用字段中也包含的数据。例如,假设我们在AdventureWorks数据库中创建了自己的SpecialtyProducts表。接着我们便可以在引用了Sales.Store 表中BusinessEntityID 字段的StoreID字段上创建一个外键约束。结果就是,StoreID字段能够只包含BusinessEntityID字段中存在的值。

一个外键同样是强制参照完整性的,这是一种存在于相关表之间的数据完整性。关于参照完整性,本文不做详述,可以参阅这里以获取更多信息。

在大多数情况下,外键只能引用定义有主键或唯一约束的字段。然而,它们也可以引用某个唯一索引组成部分的字段。在这两种情况下,引用字段可以在同一个或不同的表中,只要这些字段是在同一个数据库中即可。另外,外键字段必须在数量和数据类型上与引用字段相匹配。

在一个表上定义外键类似于定义主键。最大的区别就是你必须在CONSTRAINT语句中包含引用字段,如下例中所示:

CREATE TABLE SpecialtyProducts

(

StoreID INT NOT NULL

REFERENCES Sales.Store (BusinessEntityID),

ProductID INT NOT NULL,

AltID CHAR(7) NOT NULL,

ProductName NVARCHAR(50) NOT NULL,

CONSTRAINT pk_StoreID_ProductID

PRIMARY KEY CLUSTERED (StoreID, ProductID),

CONSTRAINT uq_AltID

UNIQUE NONCLUSTERED (AltID)

);

正如你所看到的,StoreID字段定义包含了FOREIGN KEY约束语句。然而,唯一需要的元素是REFERENCES关键字,引用表(Sales.Store)和引用字段(BusinessEntityID)。对于其他字段约束,数据库引擎会假定CONSTRAINT关键字并生成约束名称。

你可以在StoreID字段上创建一个外键来引用BusinessEntityID字段,因为这两个字段上的数据类型是兼容的(两者都是INT)。另外,在这种情况下,你在一个字段上正在创建外键且引用的字段只有一个,所以字段数目也是相匹配的。一旦你在StoreID字段上创建了外键,它就只能包含BusinessEntityID字段中的值。

不过,你可以通过创建一个表约束来替代定义外键:

CREATE TABLE SpecialtyProducts

(

StoreID INT NOT NULL,

ProductID INT NOT NULL,

AltID CHAR(7) NOT NULL,

ProductName NVARCHAR(50) NOT NULL,

CONSTRAINT pk_StoreID_ProductID

PRIMARY KEY CLUSTERED (StoreID, ProductID),

CONSTRAINT uq_AltID

UNIQUE NONCLUSTERED (AltID),

CONSTRAINT fk_StoreID

FOREIGN KEY (StoreID) REFERENCES Sales.Store (BusinessEntityID)

);

请注意,你必须在FOREIGN KEY关键字后指定外键字段(或多个字段)。但是REFERENCES子句是与一个字段约束中的REFERENCES子句相同的。

检查SQL约束

检查SQL约束是控制在定义有约束的字段中可插入的值。约束定义包含一个或多个计算结果为真或假的逻辑(布尔)表达式。插入此字段的值会根据这些表达式加以验证。如果表达式返回值为真,则将值插入;否则,它就违反了此约束。

如果你有超过一个的逻辑表达式,那么就必须使用诸如AND或OR之类的逻辑操作符来将表达式连接起来并返回一个或真或假的单一值。然而,你可以在一个字段上定义多重检查约束。这些约束会以他们定义的顺序进行处理。

对于其他的SQL约束类型,你可以将检查约束作为字段定义的一部分,而不用包含CONSTRAINT关键字和约束名称,如下例中所示:

CREATE TABLE SpecialtyProducts

(

StoreID INT NOT NULL,

ProductID INT NOT NULL,

AltID CHAR(7) NOT NULL

CHECK (AltID LIKE 'SP[1-9][0-9][0-9][0-9][0-9]'),

ProductName NVARCHAR(50) NOT NULL,

CONSTRAINT pk_StoreID_ProductID

PRIMARY KEY CLUSTERED (StoreID, ProductID),

CONSTRAINT uq_AltID

UNIQUE NONCLUSTERED (AltID),

CONSTRAINT fk_StoreID

FOREIGN KEY (StoreID) REFERENCES Sales.Store (BusinessEntityID)

);

要创建此约束,你要指定CHECK关键字和一个逻辑表达式。在此例中,表达式要求AltID值必须与一个特定的字符串值相匹配。在这种情况下,此字符串值定义了一个以“SP”开头并以五位数字结尾的常规表达式。前五个数字必须是在1到9之间,而余下每个数字必须是在0到9之间。一旦你定义了检查约束,只有计算为真的值才能插入到AltID字段。例如,你可以插入SP27930,但是SC01234就无法插入。

正如我们所看到的其他约束,我们可以创建一个表约束来获得相同的结果:

CREATE TABLE SpecialtyProducts

(

StoreID INT NOT NULL,

ProductID INT NOT NULL,

AltID CHAR(7) NOT NULL,

ProductName NVARCHAR(50) NOT NULL,

CONSTRAINT pk_StoreID_ProductID

PRIMARY KEY CLUSTERED (StoreID, ProductID),

CONSTRAINT uq_AltID

UNIQUE NONCLUSTERED (AltID),

CONSTRAINT fk_StoreID

FOREIGN KEY (StoreID) REFERENCES Sales.Store (BusinessEntityID),

CONSTRAINT ck_AltID

CHECK (AltID LIKE 'SP[1-9][0-9][0-9][0-9][0-9]')

);

此表约束以CONSTRAINT关键字和约束名称开始,跟在后面的是CHECK子句,它与之前例子中在字段约束中所使用的子句是相同的。

默认SQL约束

有时,当没有其他值提供的时候你可能想要自动在一个字段中插入一个值。这样默认SQL约束就有了用武之地。你可以使用此约束来定义一个字段的默认值。这是一个方便的方式来添加当前日期和时间到一个字段或避免使用空值。

你可以为每个字段只定义一个默认约束,而且此字段不能配置TIMESTAMP数据类型或IDENTITY属性。如果默认值是一个字符串,它就必须包括在单引号内。此外,你可以定义一个默认约束只作为一个字段约束,而不是一个表约束。例如,下面的CREATE TABLE语句在DateAdded字段上定义了一个默认约束:

CREATE TABLE SpecialtyProducts

(

StoreID INT NOT NULL,

ProductID INT NOT NULL,

AltID CHAR(7) NOT NULL,

ProductName NVARCHAR(50) NOT NULL,

DateAdded DATETIME NOT NULL DEFAULT (getdate()),

CONSTRAINT pk_StoreID_ProductID

PRIMARY KEY CLUSTERED (StoreID, ProductID),

CONSTRAINT uq_AltID

UNIQUE NONCLUSTERED (AltID),

CONSTRAINT fk_StoreID

FOREIGN KEY (StoreID) REFERENCES Sales.Store (BusinessEntityID),

CONSTRAINT ck_AltID

CHECK (AltID LIKE 'SP[1-9][0-9][0-9][0-9][0-9]')

);

默认约束定义是以DEFAULT关键字开始的,后面跟着一个定义有默认值的表达式。在此例中,表达式只简单运用了getdate()函数,它会返回当前日期和时间。

如果你想要命名你的默认约束,你还必须包含进CONSTRAINT关键字和约束名称并将它们作为字段约束定义的一部分:

CREATE TABLE SpecialtyProducts

(

StoreID INT NOT NULL,

ProductID INT NOT NULL,

AltID CHAR(7) NOT NULL,

ProductName NVARCHAR(50) NOT NULL,

DateAdded DATETIME NOT NULL

CONSTRAINT df_DateAdded DEFAULT (getdate()),

CONSTRAINT pk_StoreID_ProductID

PRIMARY KEY CLUSTERED (StoreID, ProductID),

CONSTRAINT uq_AltID

UNIQUE NONCLUSTERED (AltID),

CONSTRAINT fk_StoreID

FOREIGN KEY (StoreID) REFERENCES Sales.Store (BusinessEntityID),

CONSTRAINT ck_AltID

CHECK (AltID LIKE 'SP[1-9][0-9][0-9][0-9][0-9]')

);

一旦此默认约束已经添加进了表中,则只要有记录插入,当前日期和时间就会自动插入到DateAdded字段,除非一个值是特定于该字段的。

与SQL Server约束共事

SQL Server中的CONSTRAINT语句是一个用来维护你的数据完整性的强大工具。你可以使用此语句来创建很多不同类型的约束,例如主键约束可以确保表中的每条记录是唯一的,或是唯一约束可以确保一个字段或字段集合中的值是唯一的。要将表链接在一起并建立参照完整性,你可以在一个或多个字段上定义外键约束,或者你可以使用检查约束来限制可以插入到字段中的值。你还可以在字段上创建默认约束在给表添加记录的时候提供默认值。

但是请注意,我们这里所涵盖的只是提供了一个对约束的简介。要获取每种约束的更多信息以及确保你数据完整性其他方法的相关信息请务必参阅SQL Server联机丛书

翻译

Ranma
Ranma

相关推荐