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 CONSTRAINTFK_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
ASGETDATE()

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主键约束

    A. SQL Server主键约束 PRIMARY KEY简介 主键是唯一标识表中每一行的列或一组列.可以使用 PRIMARY KEY 约束为表创建主键. 如果主键只包含一列,则可以将 PRIMARY ...

  2. SQL Server外键约束

    A. SQL Server外键约束 SQL Server外键约束简介 外键是一个表中的一列或一组列,它唯一地标识另一个表的行. vendor_groups 和v endor 表,它们的结构如下: 每个 ...

  3. SQL Server外键中的DELETE CASCADE和UPDATE CASCADE

    In this article, we will review on DELETE CASCADE AND UPDATE CASCADE rules in SQL Server foreign key ...

  4. sql server 外键_什么是SQL Server中的外键

    sql server 外键 In this article, we will seek an answer to an important question – "What is a for ...

  5. SQL SERVER 系列(7)数据表排序和聚集函数

    SQL SERVER 系列(6)数据表排序和聚集函数 数据表排序: 当我们在对数据库操作的时候,我们经常会遇到对年龄,对考试成绩进行排序的问题,排序可以使我们对所要显示的数据一目了然,因此排序就成为了 ...

  6. sql server 主键_SQL Server中人口过多的主键和CE模型的变化

    sql server 主键 In this blog post, we are going to talk about another cardinality estimation model enh ...

  7. SQL SERVER 系列(2)数据库的创建、修改和删除

    上篇SQL SERVER系列文章中我们介绍了SQL SERVER 2005的安装与介绍.有了它,我们当然要让它给我们干活了,现在我就介绍介绍数据库这一方面的知识吧.<?xml:namespace ...

  8. 视频教程-sql server 系列课程数据库维护篇-SQL Server

    sql server 系列课程数据库维护篇 全栈工程师,2010年从事软件开发以及软件教育培训工作,至今将近十余年,在项目的开发,设计,到管理上积累了丰富的实战经验,教学风格上通俗易懂,问题解答环节一 ...

  9. SQL语句 SQL Server(代码添加约束:主键约束,外键约束,默认值约束,check约束,规则约束)

    SQL语句(基于SQL Server) 约束 primary约束,unique约束,check约束 建表时 列级 create table <table name>(<column_ ...

  10. Sql Server系列:数据库物理模式设计

    1.开发数据库时常用命名规范 1>.使用不包含数字的单数表名,如果必要的话可以增加模块名前缀. 2>.对于主键的命名,使用表名+ID的形式. 3>.作为外键的列的名字应该与它们所对应 ...

最新文章

  1. 成绩统计自动计算表格_电气计算太慢?62套自动计算EXCEL表格,一键下载秒出结果...
  2. MongoDB 4.2 正式发布,支持分布式事务!
  3. Dsp BootLoader的学习
  4. OC开发_Storyboard——MapKit
  5. 高效的企业测试-工作流和代码质量(4/6)
  6. android-x86 镜像iso下载_2019年微软MSDN原版镜像系统下载地址 Win10/7原版系统iso镜像文件...
  7. 异质图神经网络及其在电商领域中的应用
  8. MySQL数据库---数据库管理
  9. 【Java中级】(五)异常处理
  10. AtCoder - ABC 168 - E(数学推理)
  11. 怎么在国内创建谷歌账号_如何在Google相册中创建和共享协作相册
  12. java ant和maven_JAVA构建工具:Maven与Ant的区别
  13. 书摘---创业36条军规7:业务的五个问题
  14. 使用Uber-go Zap日志库
  15. Google Safe Browsing API的使用
  16. openEuler Summit | 胡欣蔚:全场景欧拉 – 志之所趋,无远弗届
  17. 在家上用宽带IPv6网站,下载六维,IPv4 to IPv6
  18. matlab爆内存电脑卡死,电脑卡死怎么办?电脑卡顿的原因和解决办法
  19. 循黑线程序c语言,51单片机舵机循黑线小车程序
  20. ImageNet-trained CNNs are biased towards texture; increasing shape bias阅读笔记

热门文章

  1. 在main中调用srand是否影响子函数中的rand()的返回值?
  2. 小熊的人生回忆(八)
  3. Android之使用MediaMetadataRetriever类获取媒体信息
  4. Hadoop单点安装(伪分布式)
  5. BigDecimal的8种精度取舍方式
  6. go语言和java比_Go VS Java:一位资深程序员对两种语言的解读
  7. dos命令行设置网络优先级_网络安全之木马病毒的防范以及攻击
  8. 神经网络入门--连载1
  9. 洛谷P3588 [POI2015]PUS(线段树优化建图)
  10. NGUI的输入框的校验(input filed script)