SQL Server 2008编程入门经典笔记(第六章:约束)

时间:2022-01-08 04:20:01

约束是一种限制。通过在列级或表级设置约束,确保数据符合某种数据完整性规则。

6.1.1 域约束
域约束处理一个或多个列。例如:想限定UnitPrice列的值大于等于0,那就是域约束。

6.1.2 实体约束
实体约束都是关于每一行的。这种形式的约束并不关心整体的列,只对特定的行感兴趣。最好的示例是这样的一个约束:要求对于某一列或列的组合,每一行都有一个唯一的值。

6.1.3 参照完整性约束
如果某列的值必须与其他列(该列可能在同一个表中,或者更通常的是在不同的表中)的值匹配,那就意味着创建了参照完整性约束。

6.3 键约束
6.3.1主键约束
在定义什么是主键之前,先简单讨论一下关系数据库。关系数据库是在"关联"数据的概念上构建的。因此,对于关系数据库的大部分表,对于每一行采用唯一标识变得非常重要。唯一标识符允许准确地引用数据库中其他表中的记录-这样在这两个表之间形成一种关系。

一个表最多可以有一个主键。

a)在已存在的表上创建主键约束
ALTER TABLE dbo.Sales
ADD CONSTRAINT PK_SalesID
PRIMARY KEY (ID);

6.3.2 外键约束
外键既能保证数据完整性,也能表现表之间的关系。如果添加外键到一个表,就在您定义外键的表(引用表)和外键引用的表(被引用表)之间创建依赖关系。添加外键之后,引入引用表的记录要么必须与被引用表中被引用列的某条记录匹配,要么外键列的值必须设置为NULL。
CREATE TABLE Orders
(
  OrderID int IDENTITY NOT NULL PRIMARY KEY,
  CustomerNo int NOT NULL FOREIGN KEY REFERENCES Customers(CustomerNo),
  OrderDate date NOT NULL,
  EmployeeID int NOT NULL
);

和主键不同,每个表中的外键数目不限制唯一性。

a)在已存在的表中添加一个外键
ALTER TABLE dbo.Orders
ADD CONSTRAINT FK_EmployeeCreatesOrder
FOREIGN KEY (EmployeeID) REFERENCES Employees(EmployeeID)
注意:如果想删除Employees表,那么会得到一个错误。当在Orders表中建立到Employees表的引用时,这两个表就"模式绑定"了-即现在Employees表知道在其上有所谓的依赖了。SQL Server不允许删除一个被其他表引用的表。必须现在Orders表中删除外键,完后SQL Server才允许删除Employees表。
例子:
CREATE TABLE Customers
(
  CustomerNo int not null primary key identity,
  CustomerName varchar(50),
  CustomerAge int
);

CREATE TABLE Orders
(
  OrderID int IDENTITY NOT NULL PRIMARY KEY,
  CustomerNo int NOT NULL FOREIGN KEY REFERENCES Customers(CustomerNo),
  OrderDate date NOT NULL,
  EmployeeID int NOT NULL
);
必须先删除drop table Orders;然后才能删除drop table Customers;

b)级联动作
外键和其他类型键的一个重要区别是:外键是双向的,即不仅是限制子表的值必须存在于父表中,还在每次对父表操作后检查子行。SQL Server的默认行为是在子行存在时"限制"父行被删除。

6.3.3 唯一约束
唯一约束与主键比较相似,共同点在于它们都要求表中指定的列上有一个唯一值。将唯一约束称为替换键。主要的区别是唯一约束没有被看作表中记录的唯一标识符,而且可以有多个唯一约束(而在每个表中只能有一个主键)。
一旦建立了唯一约束,那么指定列中的每个值必须是唯一的。如果更新或者插入一行在带唯一约束的列上有已经存在的值的记录,SQL Server将抛出错误。

CREATE TABLE Shippers
(
  ShippersID int identity not null primary key,
  ......
  PhoneNo varchar(14) not null unique
);
注意:和主键不同,唯一约束不会自动防止设置一个NULL值。是否允许NULL取决于表中相应列的NULL选项的设置。然而要记住,如果确实允许NULL,那么只能插入一个NULL(虽然这些NULL值并不相等,但在唯一约束看来,它们是相等的)。

a)在已存在的表中创建唯一约束
ALTER TABLE Employees
ADD CONSTRAINT AK_EmployeeSSN
UNIQUE (SSN);

6.4 CHECK约束
CHECK约束较好的方面是它不限于一个特定的列。CHECK约束可以和一个列关联,但是也可以和表关联,因为他们可以检查一个列的值相对于另外一个列的值,只要这些列都在同一个表中以及值是在更新或者插入的同一行中。
ALTER TABLE Customers
  ADD CONSTRAINT CN_CustomerDateInSystem
  CHECK
  (DateInSystem<=GETDATE());

6.5 DEFAULT约束
它定义了当插入的新行对于定义默认约束的列未提供相应数据时改怎么办。
a)默认值只在INSERT语句中使用-在UPDATE语句和DELETE语句中被忽略。
b)如果在INSERT语句中提供了任意值,那么就不使用默认值。
c)如果没有提供值,那么总是使用默认值。

6.5.1 在CREATE TABLE语句中定义DEFAULT约束
CREATE TABLE Shippers
(
  ShipperID int identity not null primary key,
  ......
  DateInSystem smalldatetime not null default GETDATE ()
);

6.5.2 在已存在的表中添加DEFAULT约束
ALTER TABLE Customers
  ADD CONSTRAINT CN_CustomerDefaultDateInSystem
  DEFAULT GETDATE() FOR DateInSystem