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. SQLite 的创建与编辑

    创建数据库语句 -(void)creatData { sqlite3 *sqlite = nil; NSString *filePath = [NSHomeDirectory() stringByAp ...

  2. POJ 1979 题解

    Red and Black Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 31722   Accepted: 17298 D ...

  3. C#/PHP调用有SoapHeader的WebService

    日前调用第三方WebService接口时遇到了SoapHeader验证的问题,记录一下解决方法. 接口需要的格式: <soapenv:Header> <ReqSOAPHeader x ...

  4. 对JavaScript闭包和原型理解

    最近在学js脚本的一些东西觉得里面有2个知识点比较难理解所以做了如下总结. 1.闭包 简单的理解:一个函数a ,内部有个函数b,那么这个函数b当被作为a函数的返回值得时候被外部的全局变量引用了,那么这 ...

  5. SQL 提高查询效率

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况p4: 2.4内存: 1 Gos: windows 2003数据库: ms sql server 2000目的: 查询性能测试, ...

  6. 简单说说.Net中的弱引用

    弱引用是什么? 要搞清楚什么是弱引用,我们需要先知道强引用是什么.强引用并不是什么深奥的概念,其实我们平时所使用的.Net引用就是强引用.例如: Cat kitty = new Cat(); 变量ki ...

  7. 解决Unity5+Vuforia+Network本地联机发布到Android上白屏的问题

    Unity5+Vuforia+Network本地联机,在Android下点击联机,然后识别模型就出现白屏,点击屏幕上相应位置的按钮(已白屏,但点击该看不见的按钮)还是能起作用,如跳转到其他场景正常. ...

  8. C/C++_date&time

    在标准C/C++中与日期和时间相关的数据结构 注意:年份是实际年份与  1900  的差值 我们可通过tm结构来获得日期和时间,tm结构在time.h中的定义如下: #ifndef _TM_DEFIN ...

  9. 【开源】MQTT推送服务器——zer0MqttServer(Java编写)

    目录 说明 功能 如何使用 参考帮助 说明 重要的放前面:V1.0版本是一个非常基础的版本,除了完整的MQTT协议实现外,其他功能什么都没做. MQTT 协议是 IBM 开发的即时通讯协议,相对于 I ...

  10. Mysql 行列转换

    一.第一种 原数据表 转换后 DROP TABLE IF EXISTS tempdynamic; CREATE TEMPORARY TABLE tempdynamic ( SELECT p.fsPay ...