SQL 约束语句: PRIMARY KEY 及UNIQUE

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

这是关于在SQL Server中各种SQL约束语句的第一部分。本文涵盖了主键和唯一约束,而第二部分介绍了外键,检查和默认约束。 SQL Server允许你定义表约束来帮助确保数据完整性。SQL约束会执行规则以控制你插入到字段的值类型,这样就可以防止其不符合字段数据类型和非空性所提供的控制规则。

例如,你可以定义一个SQL约束来指定一个字段中的每个值都必须是唯一的或是在一个特定范围内。 要给一个表添加SQL约束,你需要包含一个CONSTRAINT语句并将其作为字段或是表定义的一部分。此语句支持五种类型的约束:主键,唯一,外键,检查和默认。每种类型都服务于一个特定的目的以确保插入到字段的数据都精确的……

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

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

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

SQL Server允许你定义表约束来帮助确保数据完整性。SQL约束会执行规则以控制你插入到字段的值类型,这样就可以防止其不符合字段数据类型和非空性所提供的控制规则。例如,你可以定义一个SQL约束来指定一个字段中的每个值都必须是唯一的或是在一个特定范围内。

要给一个表添加SQL约束,你需要包含一个CONSTRAINT语句并将其作为字段或是表定义的一部分。此语句支持五种类型的约束:主键,唯一,外键,检查和默认。每种类型都服务于一个特定的目的以确保插入到字段的数据都精确的符合对数据进行管理的业务规则。

主键SQL约束

主键约束是由一个表中其值可以唯一标示每条记录的一个或多个字段组成的。你在一个表上只能定义一个主键。你所插入到主键字段的任何值都必须是唯一的。如果你在多个字段上定义了一个主键,这些字段就会作为一个整体来体现唯一性;单个字段可以包含重复值,但是值集合不能重复。例如,假设你在一个包含有产品数据的表中的StoreID和ProductID字段上定义了一个主键。这两个字段可能包含类似如下的数据:

 

StoreID

ProductID

101

4297

101

3822

101

6944

102

8822

102

4297

102

3822

103

6944

103

8822

注意,每个字段都包含重复值,但没有值对儿是重复的。因此,每个值集合都可以唯一标示每条数据记录,即使数据在其他字段是重复的。

数据库引擎通过创建一个聚簇或非聚簇唯一索引来执行主键约束的唯一性。如果你创建主键而没有指定索引类型,那么在没有其他聚簇索引存在的情况下数据库引擎就会创建一个聚簇索引。(一个表上只可以定义一个聚簇索引。)此外,所有主键字段都必须配置为非空。如果字段定义不显式指定为非空,那么主键字段就会设置为非空。

要在一个表上创建主键,你必须在字段或表定义中包含CONSTRAINT语句。例如,以下CREATE TABLE语句定义了一个主键并将其作为ProductID字段定义的一部分:

CREATE TABLE SpecialtyProducts

(

ProductID INT NOT NULL

CONSTRAINT pk_ProductID PRIMARY KEY CLUSTERED,

ProductName NVARCHAR(50) NOT NULL

);

你只需要在字段定义上添加CONSTRAINT语句。在指定了CONSTRAINT关键字之后,你要为此约束提供名称(在本例中是pk_ProductID),后面跟着的是PRIMARY KEY关键字以及可选关键字CLUSTERED。

你还可以使用ALTER TABLE语句来添加或更新一个约束。在本文中,我们主要关注于CREATE TABLE语句,但CONSTRAINT语句在ALTER TABLE语句中是非常类似的。你可以从这里了解到更多信息。

当定义一个主键约束并将其作为字段定义的一部分时,你可以通过删除CONSTRAINT关键字、约束名称和索引类型来缩短约束定义:

CREATE TABLE SpecialtyProducts

(

ProductID INT PRIMARY KEY,

ProductName NVARCHAR(50) NOT NULL

);

如上例所示,在一个单一字段上创建主键只要求你添加PRIMARY KEY关键字。数据库引擎会分别自动配置非空性和索引类型为NOT NULL和CLUSTERED,此外还会生成约束名称。

还有一种方法可以创建主键,就是添加一个CONSTRAINT语句作为表约束,如下例中所示:

CREATE TABLE SpecialtyProducts

(

ProductID INT NOT NULL,

ProductName NVARCHAR(50) NOT NULL,

CONSTRAINT pk_ProductID

PRIMARY KEY CLUSTERED (ProductID)

);

在本例中,你在进行字段定义的时候包含了CONSTRAINT语句。你必须指定CONSTRAINT关键字,约束名称和PRIMARY KEY关键字。而索引类型是可选的。此外,你还必须在括号中指定主键字段。定义一个表约束的好处是,它允许你在多个字段上配置主键。例如,下面的CREATE TABLE 语句中的CONSTRAINT语句在StoreID和ProductID字段上定义了主键:

CREATE TABLE SpecialtyProducts

(

StoreID INT NOT NULL,

ProductID INT NOT NULL,

ProductName NVARCHAR(50) NOT NULL,

CONSTRAINT pk_StoreID_ProductID

PRIMARY KEY CLUSTERED (StoreID, ProductID)

);

现在,StoreID和ProductID字段中的值,当它们结合在一起时确保了表中每条记录是唯一的。

对于单一字段主键,你可以选择添加一个字段或表约束。你要采用哪种方法部分取决于你企业的开发标准,但是无论你采用哪种方法,使用完整CONSTRAINT语句的最大好处在于你可以命名你的约束,这比起让它们自动生成名称要简单的多。

唯一SQL约束

唯一约束可以定义在一个或多个字段上作为主键约束的替代品。如主键约束一样,唯一约束强制执行唯一性;然而,它也是允许空值的。当一个表上已经定义了一个主键并且你想要确保在一个或多个字段中值的唯一性的时候唯一约束是特别方便的。

当你在创建一个唯一约束的时候,数据库引擎会创建一个聚簇或非聚簇索引以强制执行唯一性。如果你不指定索引类型,引擎就会创建一个非聚簇索引。只要表上未定义有聚簇索引,你就可以创建一个聚簇唯一索引。

要添加一个唯一SQL约束,你只需要在你的字段定义中包含UNIQUE关键字即可,如下例中所示:

CREATE TABLE SpecialtyProducts

(

StoreID INT NOT NULL,

ProductID INT NOT NULL,

AltID CHAR(7) NOT NULL UNIQUE,

ProductName NVARCHAR(50) NOT NULL,

CONSTRAINT pk_StoreID_ProductID

PRIMARY KEY CLUSTERED (StoreID, ProductID)

);

对于主键约束,你可以包含CONSTRAINT关键字并提供一个约束名称,但是如果你不这样做的话,就如上例中一般,数据库引擎就会提供CONSTRAINT关键字并自动生成约束名称。你还可以在UNIQUE关键字后指定索引类型,但是这只有在你想要创建聚簇索引的时候才是必需的。

SQL Server还允许你定义一个唯一约束作为表约束。正如前例中那样,下面的CREATE TABLE语句在AltID字段上定义了一个UNIQUE语句:

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关键字,约束名称和UNIQUE关键字。你可以选择性地包含索引类型(在本例中是NONCLUSTERED)。然而,你还必须提供此约束是在哪个字段或是哪些字段上定义的。如果是在多个字段上定义此约束,你必须使用一个表约束。