Sql Server系列:键和约束
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系列:键和约束的更多相关文章
- SQL Server分区键列必须是主键一部分
SQL Server分区键列必须是主键一部分. 必须把分区列包含在主键/唯一约束/唯一索引的键列中. USE tempdb GO -- 测试表 CREATE TABLE dbo.tb( id int, ...
- SQL Server 系列文章快速导航(SWF版)
一.前言 在博客园写博客不自不觉已经有5个年头了,一开始只是为了记录工作中遇到的问题和解决办法,后来写的文章不自不觉的侧重在SQL Server方面的技术文章,在2014年1月终于鼓起勇气申请了微软S ...
- SQL Server系列文章目录
SQL Server系列文章目录SQL Server系列文章目录SQL Server系列文章目录SQL Server系列文章目录
- Sql Server 主键 外键约束
主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如果为 ...
- SQL Server外键关系是强制约束,外键值也可以是空(NULL)
在SQL Server中,实际上外键值可不可以为空(NULL),和外键关系是不是强制约束无关. 我们先在SQL Server数据库中建立两张表People和Car,一个People可以有多个Car,所 ...
- SQL Server系列目录
一.SQL Server基础部分 1 数据库概念及规范化设计 1.1 数据库物理模式设计 1.2 Microsoft SQL Server Management Studio模板资源管理器 2 数据 ...
- Sql Server系列:规范化及基本设计
1 理解表 表是具有相同常规属性(attribute)的数据实例的集合.这些数据实例组成数据行和列. 2 数据表设计范式 2.1 第一范式 第一范式(1NF)是关于消除重复数据组和保证原子性的规范化. ...
- Sql Server 主键由字母数字组成并按照数字自动增长
在SQL SERVER 中如果我们想要使主键按照一定规则自动增长我们可以这样做: 这里我们新建一张研究表,里面有研究ID,研究人员姓名和研究医院. 我们使SicentificId 设为主键 并且从1开 ...
- SQL Server 数据完整性的实现——约束
SQL Server数据库采用的是关系数据模型,而关系数据模型本身的优点之一就是模型本身集成了数据完整性.作为模型一部分而实施的数据完整性(例如在创建数据表时的列属性定义)称作为声明式(Declara ...
- Sql Server系列:分区表操作
1. 分区表简介 分区表在逻辑上是一个表,而物理上是多个表.从用户角度来看,分区表和普通表是一样的.使用分区表的主要目的是为改善大型表以及具有多个访问模式的表的可伸缩性和可管理性. 分区表是把数据按设 ...
随机推荐
- Linux tricks
Environment Settings Path Globally set path is in /etc/profile; or the user's .bash_profile for part ...
- Android 单元测试(junit、mockito、robolectric)
1.运用JUnit4 进行单元测试 首先在工程的 src 文件夹内创建 test 和 test/java 文件夹. 打开工程的 build.gradle(Module:app)文件,添加JUnit4依 ...
- 20161022 NOIP模拟赛 T1 解题报告
旅行者问题 [问题描述] lahub是一个旅行者的粉丝,他想成为一个真正的旅行者,所以他计划开始一段旅行.lahub想去参观n个目的地(都在一条直道上).lahub在起点开始他的旅行.第i个目的地和起 ...
- 【生活没有希望】NOIP2010初赛 烽火传递 smartoj1475
整天初赛题做做,生活没有希望 用单调队列优化的dp 因为满足后来的总比先来的(在某些方面)更优 所以能用单调队列 n2变成n #include <cstdio> ],b[],c[]; in ...
- 【SRM】649 t2
题意 一个数列\(A\),数的范围均在\([0, 2^N-1]\)内,求一个\(B\),使得新生成的数列\(C\)中逆序对最多(\(C_i = A_i xor B\)),输出最多的逆序对.(\(|A| ...
- Linux Shell 编程中的特殊符号
一.井号 # 1.在脚本文件中对一行进行注释. 2.在引号和\符号后不是注释,只是#号本身: echo "12 # hehe" echo '12 # hehe' echo 12 \ ...
- c#/js代码命名规范及代码规范
常用命名 列表,lUser 数组,arrUser 字符串,strTitle 用,分割的字符串,strStatuss(多个用逗号分割的状态) C# Entity层 统一以E开始,比如EUser,EOrd ...
- Android APK瘦身之Android Studio Lint (代码审查)
******** ******** 第一部分: 瘦身内容介绍 ******** ******** 项目新版本的迭代接近尾声, 因为历史累积问题, 导致有很多无效的资源让已经臃肿的APK变得更肿, 因此 ...
- java并发编程(十五)内存可见两种方式 加锁和volatile
1.volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的同步机制. ...
- 书中的银行,我们一起奋斗的C#,只因乐在其中~
梦回C#,只因心中还留有那么一点执着,相信大家应该也有这些感触吧!!所以呢?我想给大伙分享我的一些学习,也希望大家能给我多点建议,让我们一起进步,共同成长!!! 那么我们就来看一下该怎么运 ...