1 约束的类型

  约束可以分为3大类:实体约束、域约束和参照完整性约束。

1.1 实体约束

  实体约束都是关于比较行的,实体约束并不关心整体列中的数据,它只对特定行感兴趣。

1.2 域约束

  域约束处理一个或多个列,确保一个特定列或一组特定列满足特地的标准。在插入或更新一行时,域约束不考虑其他行。如限定UnitPrice列的值大于或等于0,这就是域约束。

1.3 参照完整性约束

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

2 键约束

  常用的键约束包括:主键约束、外键约束和唯一约束(也叫替换键约束)。一个表只能有一个主键约束,可以有多个外键约束和多个唯一约束。

2.1 主键约束

  主键是每行的唯一标识符,必须包含唯一的值,不能为NULL。一个表可以有多个主键,当然也允许表中不设主键。

  主键约束命名的可参考规则:PK_[table_name]

ALTER TABLE dbo.[Product] ADD CONSTRAINT PK_Product PRIMARY KEY ([ProductID])

  一般情况下主键还会同时创建聚集索引:

ALTER TABLE dbo.[Product] ADD CONSTRAINT PK_Product PRIMARY KEY CLUSTERED ([ProductID])

2.2 外键约束

  外键能确保数据完整性,也能表现表之间的关系。添加外键之后,插入引用表的记录要么必须与被引用的表列中的某条记录匹配,要么外键列的值设置为NULL。

  外键约束命名的可参考规则:FK_<foreign_key_table_name>_<primary_key_table_name>

  若外键表中存在多个外键字段对同一个主键表的引用,则外键约束的命名可参考规则:

  FK_<foreign_key_table_name>_<primary_key_table_name>_<colunm_name>

ALTER TABLE dbo.Product ADD CONSTRAINT
FK_Product_Category FOREIGN KEY
(
CategoryID
)
REFERENCES dbo.Category
(
   CategoryID
)
ON DELETE CASCADE

2.3 唯一约束

  唯一约束要求在表中指定的列上有一个唯一值,一个表可以有多个唯一约束。

  唯一约束可参考的命名规则:UQ_<table_name>_<column_name>

ALTER TABLE dbo.[Product] ADD CONSTRAINT UQ_Product_BarCode UNIQUE ([BarCode])

3 域约束

3.1 CHECK约束

  CHECK约束不限于一个特定的列,CHECK约束可以和一个列关联,也可以和表关联。可以检查一个列的值相对于另外一个列的值。CHECK约束可以用于检查列值组合是否满足条件。

  CHECK约束可参考命名规则:CK_<table_name>_<column_name>

ALTER TABLE dbo.[Product] ADD CONSTRAINT CK_Product_UnitPrice CHECK ([UnitPrice] >= 0)
ALTER TABLE dbo.[Product] ADD CONSTRAINT CK_Product_UnitPrice CHECK ([BeginDate] > [EndDate])

3.2 DEFAULT约束

  DEFAULT约束定义了当插入新的记录时为未提供相应数据的列设置默认值,默认值只在INSERT时起作用。

  DEFAULT约束可参考命名规则:DF_<table_name>_<column_name>

ALTER TABLE dbo.[Product] ADD CONSTRAINT DF_Product_CreateDate DEFAULT GETDATE() FOR [CreateDate]

4 禁用约束

  有时会希望暂时或永久的消除约束,禁用一个数据完整性规则通常是因为已经有无效数据,这样的数据通常分为两类:在创建约束时已经存在的数据和在约束创建以后希望添加的数据。

  不能禁用主键约束或者唯一约束。

4.1 在创建约束时忽略无效的数据

  要添加一个约束,但又不将其应用到已存在的数据中,可以在执行ALTER TABLE语句添加约束时使用WITH NOCHECK选项。

ALTER TABLE dbo.[Product] WITH NOCHECK
ADD CONSTRAINT CK_Product_UnitPrice CHECK ([UnitPrice] > 0)

4.2 临时禁用已存在的约束

  在ALTER语句中使用NOCHECK选项可以临时取消需要处理的约束。

ALTER TABLE dbo.[Product] NOCHECK CONSTRAINT CK_Product_UnitPrice

  重新恢复约束

ALTER TABLE dbo.[Product] CHECK CONSTRAINT CK_Product_UnitPrice

  禁用全部约束

ALTER TABLE [dbo].[Product] NOCHECK CONSTRAINT ALL

  启用全部约束

ALTER TABLE [dbo].[Product] CHECK CONSTRAINT ALL

5 删除约束

ALTER TABLE dbo.[Product] DROP CONSTRAINT CK_Product_UnitPrice

6 查看表中全部约束

EXEC sp_helpconstraint Product

7 规则

  规则与CHECK类似,它们之间的区别是规则每次只能作用于一个列,而CHECK约束可以作用于多个列,如BeginDate > EndDate。可以将同一个规则分别绑定到一个表中的多个列,规则分别作用于每个列,不会意识到其他列的存在。

7.1 创建规则

  创建规则语法

CREATE RULE [ schema_name . ] rule_name
AS condition_expression
[ ; ]

  condition_expression 包括一个变量。 每个局部变量的前面都有一个@符号,在创建规则时可以使用任何名称或符号表示值。

  为特定列创建规则

CREATE RULE RU_UnitPrice
AS
@UnitPrice > 0

  创建具有范围的规则

CREATE RULE RU_Range
AS
@Value > 0 AND @Value < 100

7.2 查看规则定义

EXEC sp_helptext RU_Range

7.3 绑定规则

sp_bindrule [ @rulename = ] 'rule' ,
[ @objname = ] 'object_name'
[ , [ @futureonly = ] 'futureonly_flag' ]
EXEC sp_bindrule 'RU_UnitPrice','[Product].[UnitPrice]'

7.4 取消规则

sp_unbindrule [ @objname = ] 'object_name'
[ , [ @futureonly = ] 'futureonly_flag' ]
EXEC sp_unbindrule '[Product].[UnitPrice]'

7.5 删除规则

DROP RULE { [ schema_name . ] rule_name } [ ,...n ] [ ; ]
DROP RULE RU_UnitPrice

8. 默认值

8.1 创建默认值

CREATE DEFAULT [ schema_name . ] default_name
AS constant_expression [ ; ]
CREATE DEFAULT DF_CurrentDateTime
AS
GETDATE()

8.2 查看默认值定义

EXEC sp_helptext DF_CurrentDateTime

8.3 绑定默认值

EXEC sp_bindefault 'DF_CurrentDateTime','[Product].[CreateDate]'

8.4 取消默认值

EXEC sp_unbindefault '[Product].[CreateDate]'

8.5 删除默认值

DROP DEFAULT DF_CurrentDateTime

9 查看表中的约束

EXEC sp_helpconstraint [Product]

Sql Server系列:键和约束的更多相关文章

  1. SQL Server分区键列必须是主键一部分

    SQL Server分区键列必须是主键一部分. 必须把分区列包含在主键/唯一约束/唯一索引的键列中. USE tempdb GO -- 测试表 CREATE TABLE dbo.tb( id int, ...

  2. SQL Server 系列文章快速导航(SWF版)

    一.前言 在博客园写博客不自不觉已经有5个年头了,一开始只是为了记录工作中遇到的问题和解决办法,后来写的文章不自不觉的侧重在SQL Server方面的技术文章,在2014年1月终于鼓起勇气申请了微软S ...

  3. SQL Server系列文章目录

    SQL Server系列文章目录SQL Server系列文章目录SQL Server系列文章目录SQL Server系列文章目录

  4. Sql Server 主键 外键约束

    主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如果为 ...

  5. SQL Server外键关系是强制约束,外键值也可以是空(NULL)

    在SQL Server中,实际上外键值可不可以为空(NULL),和外键关系是不是强制约束无关. 我们先在SQL Server数据库中建立两张表People和Car,一个People可以有多个Car,所 ...

  6. SQL Server系列目录

    一.SQL Server基础部分 1  数据库概念及规范化设计 1.1 数据库物理模式设计 1.2 Microsoft SQL Server Management Studio模板资源管理器 2 数据 ...

  7. Sql Server系列:规范化及基本设计

    1 理解表 表是具有相同常规属性(attribute)的数据实例的集合.这些数据实例组成数据行和列. 2 数据表设计范式 2.1 第一范式 第一范式(1NF)是关于消除重复数据组和保证原子性的规范化. ...

  8. Sql Server 主键由字母数字组成并按照数字自动增长

    在SQL SERVER 中如果我们想要使主键按照一定规则自动增长我们可以这样做: 这里我们新建一张研究表,里面有研究ID,研究人员姓名和研究医院. 我们使SicentificId 设为主键 并且从1开 ...

  9. SQL Server 数据完整性的实现——约束

    SQL Server数据库采用的是关系数据模型,而关系数据模型本身的优点之一就是模型本身集成了数据完整性.作为模型一部分而实施的数据完整性(例如在创建数据表时的列属性定义)称作为声明式(Declara ...

  10. Sql Server系列:分区表操作

    1. 分区表简介 分区表在逻辑上是一个表,而物理上是多个表.从用户角度来看,分区表和普通表是一样的.使用分区表的主要目的是为改善大型表以及具有多个访问模式的表的可伸缩性和可管理性. 分区表是把数据按设 ...

随机推荐

  1. canvas实例 ---- 制作简易迷宫(一)

    这个系列分为两部分,第一部分为迷宫的生成及操作,第二部分为自动寻路算法. 我们先看效果: See the Pen QGKBjm by fanyipin (@fanyipin) on CodePen. ...

  2. windows 10 开始菜单和cortana无法工作的问题

    过了个周末,到了实验室一开机发现报了个关键错误:开始菜单和cortana无法工作. 经过一番google ,发现问题,原来是360禁用了一个服务导致,这个服务是UserManager. 我直接去开启发 ...

  3. jmobile学习之路 ----设备检测

    用一个库,device.js.这是一种最简单的方法.device.js库,不依赖jQuery框架. <!doctype html> <html lang="en" ...

  4. 关于C#的微信开发的入门记录一

    在之前老是看到一些微信开发的例子,但是作为初学者会有很多问题,之前我也找了很多帖子,但是最终也没能解决,现在刚好手里有一个项目,总结一下分享给准备做却动不了手的朋友们,本文只是以我个人的经验作为浅谈( ...

  5. 提取ecshop的mysql类

    在下一篇文章中,我还将介绍如何完善ecshop的mysql类,使用ecshop的数据库前缀 下载ecshop后,解压缩,进入目录upload/includes,复制里面的cls_mysql.php放进 ...

  6. FizzBuzzWhizz游戏的高效解法

    最近比较火的一道题(传送门),看见园友们的谈论(传送门1 传送门2),都是从1到100的扫描,我想说说的另一种想法. 可以把这道题转换成给100个人发纸牌的游戏,每人所报的就是纸牌上写的东西. 纸牌发 ...

  7. Android四大组件--事务详解(转)

    一.什么是事务 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取.事务的正确执行使得数据库从一种状态转换成另一种状态.   事务必须服从ISO/IEC所制定的ACID原则. ...

  8. Unity学习疑问记录之坐标体系

    [Unity3D的四种坐标系] 1.World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的.transform.position可以获得该位置坐标. ...

  9. Get-FilewithExtension

    1: <# 2: 用途: 3: 根据指定的路径和文件类型查找出文件,显示其完整路径以及大小 4: 使用方法: 5: Get-FilewithExtension -path path1,path2 ...

  10. 参数的元数据信息&数据库的元数据信息

    package it.cast.jdbc; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql. ...