约束(读书笔记)

1 约束的类型

1.1 域约束

域约束确保一个或一组特定列满足特定的标准。
包含CHECK约束、规则、默认值和DEFAULT约束。

1.2 实体约束

实体约束时关于每一行的。

1.3 参照完整性约束

如果某列的值必须与其他列(通常在不同表中)的值匹配,那就意味着创建了参照完整性约束。

2 约束命名

由系统生成的名称可能是这样的:PK_Employees_145C0A3F
Notice: PK代表主键(primary key), Employees 说明是在Employees表中,剩下的部分为确保唯一性而随机生成的值。

3 键约束

包括 主键、外键、替换键和倒置键。

3.1 主键约束

主键是每行的唯一标识符,必须包含唯一的值(因此不能为NULL)。唯一标识符允许准确地引用数据库中其他表的记录。
一个表最多可以有一个主键。
创建主键可以有2种方法:

  • CREATE TABLE
Create table Customers
(
    CustomerNo int IDENTITY NOT NULL PRIMARY KEY,
    ...
)
  • ALTER TABLE
Alter table Employees Add CONSTRAINT PK_EmployeeID 
PRIMARY KEY(EmployeeID);

3.2 外键约束

引用表和被引用表之间创建的依赖关系。
Notice:

  • 添加外键之后,插入引用表的记录要么必须与被引用表中被引用列的某条记录匹配,要么外键列的值必须设置为NULL。
  • 被外键引用的列必须定义一个主键或者唯一约束。
  • 主键和外键可以存在于同一列中。
  • 外键不限制唯一性。每个表中可以有0~253个外键。一个给定的列只能引用一个外键,而一个外键可以涉及多个列。

3.2.1 在已存在的表中添加一个外键

Alter table Orders Add CONSTRAINT FK_EmployeeCreatesOrder
FOREIGN KEY (EmployeeID) REFERENCES Employees (EmployeeID)

3.2.2 使一个表自引用

Notice: 在实际创建这种引用基于标识列的非空字段的自引用约束之前,很关键的一点是在添加外键之前表中至少有一行。为什么呢?问题在于,实际是在检查并强制外键操作之后才选择并填充标识值的。那意味着当检查发生时,还没有值供第一行引用。在这里,另外一种办法就是照常创建外键,但是在添加第一行的时候禁用它。

Alter table Employees Add CONSTRAINT FK_EmployeeHasManager 
FOREIGN KEY (ManagerEmpID) REFERENCES Employees (EmployeeID)

OR

Create table Employees
(
    EmployeeID int IDENTITY NOT NULL PRIMARY KEY,
    ...
    ManagerEmpID int NOT NULL REFERENCE Employees(EmployeeID)
)

Notice:

  • Sql Server不允许删除一个被其他表引用的表。
  • 只有当外键约束的列允许NULL值,这样可以让初始韩的相应列为NULL,就不必预先输入初始行了。

3.2.3 级联动作

每次对父表操作后,子表自动删除和更新的过程称为级联。

Create table OrderDetails
(
    OrderID int NOT NULL,
    PartNo varchar(10) NOT NULL,
    ...
    CONSTRAINT PKOrderDetails PRIMARY KEY (OrderID, PartNo),
    CONSTRAINT FKOrderContainsDetails FOREIGN KEY (OrderID) REFERENCE Orders(OrderID) 
    ON UPDATE NO ACTION
    ON DELETE CASCADE
);

父记录(Orders)被更新,级联更新不会发生在子表(OrderDetails)中。
对父表(Orders)进行删除操作,这个删除操作还级联到了子表(OrderDetails)中匹配的记录。

Notice: 级联动作的一个危险之处是很容易实现不了DELETE或者UPDATE语句在数据库中进行的所有操作。

3.2.4 关于外键的其他方面考虑

  • 如何使外键中的值为必须的或可选的
    –通过定义引用列为NOT NULL,可以使外键完全是必须的
    –不填充任何值,而使该值为NULL,可以使外键值为可选的
  • 外键实现双向的方式
    –CASCADE动作

3.3 唯一约束

唯一约束与主键比较相似,它们都要求表中指定的列上有唯一值。区别是表中允许多个唯一约束;唯一约束不会自动防止设置一个NULL值。

创建唯一约束:

Create table Shippers
(
    ...
    PhoneNo varchar(14) NOT NULL UNIQUE
)

OR

Alter table Employees Add CONSTARINT AK_EmployeeSSN UNIQUE(SSN);

3.4 CHECK约束

CHECK约束可以和一个列关联,也可以和表关联。因为它们可以检查一个列的值相对于另一个列的值,只要这些列都在同一表中以及值是在更新或者插入的同一行中。

几乎所有可放到Where子句的条件都可以放到约束中,和其他选择相比,CHECK约束执行速度更快。

eg.

Alter table Customers Add CONSTRAINT CN_CustomerDateInSystem CHECK (DateInSystem <= GETDATE());

3.5 DEFAULT 约束

  • 默认值在INSERT语句中使用,在UPDATE语句和DELETE语句中被忽略。
  • 如果在INSERT语句中提供了任意值,那么就不使用默认值
  • 如果没有提供值,那么总是使用默认值。
  • 和除主键约束外的其他所有约束一样,在每个表中可以添加多个DEFAULT约束。

添加DEFAULT约束:

Create table Shippers
(
    ...
    DateInSystem smalldatetime NOT NULL DEFAULT GETDATE()
)

OR

ALter table Customers Add CONSTRAINT CN_CustomerDefaultDateInSystem DEFAULT GETDATE() for DateInSystem

3.6 禁用约束

  • 在创建约束时忽略无效数据
    要添加一个约束,但又不应用到已存在此格式的数据中,可以使用WITH NOCHECK选项。
Alter table Customers WITH NOCHECK Add CONSTRAINT CN_CustomerPhoneNo CHECK( Phone LIKE '([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]')
  • 临时禁用已存在的约束

禁用该约束

Alter table Customers NOCHECK CONSTRAINT CN_CustomerPhoneNo

启用该约束

Alter table Customers CHECK CONSTRAINT CN_CustomerPhoneNo

3.7 规则和默认值

规则和默认值的应用要早于CHECK和DEFAULT约束。它们是较老的SQL Server 备用约束的一部分。
区别:

  • 约束时一个表的特征,而规则和默认值是表或自身的实际对象
  • 约束时在表定义中定义的,而规则和默认值是单独定义的,然后“绑定”到表上。

3.7.1 规则

规则只能作用于一个列,不支持多列关系的约束定义。

  • 建立规则
Create RULE SalaryRule as @Salary > 0 
  • 绑定规则
EXEC sp_bindrule 'SalaryRule','Employees.Salary';
  • 解绑规则
EXEC sp_unbindrule 'Employees.Salary'
  • 删除规则
Drop rule SalaryRule

3.7.2 默认值

默认值和DEFAULT约束类似,区别在于他们被追加到表中的方式和用户自定义数据类型的默认值(是对象,而不是约束)支持。

定义默认值的语法:

Create DEFAULT <default name> as <default value>

绑定(sp_bindefault)、解绑(sp_unbindefault)和删除(drop default)的方式都和规则一样。

3.7.3 确定哪个表和数据类型使用给定的规则或默认值

EXEC sp_depends <object name>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值