SQL Server数据库采用的是关系数据模型,而关系数据模型本身的优点之一就是模型本身集成了数据完整性。作为模型一部分而实施的数据完整性(例如在创建数据表时的列属性定义)称作为声明式(Declarate)数据完整性。用代码来实施的数据完整性(例如存储过程、触发器等)称为过程式(procedural)数据完整性

  以下介绍几种声明式约束概要知识:

一:主键约束(Primary Key Constraints)

  主键约束实施行的唯一约束,同时不允许行的属性为null值。约束属性中,每一记录行只能在数据表中出现一次。换而言之,表内的每行数据可以被唯一确定。

  约束的创建

    1:主键约束只能在数据表中创建一次;

    2:不能再属性为允许NULL值得列上创建主键约束。

  创建方法

    1:创建表时在数据列上声明

      create table temp1 (row_id int identity(1,1) not null primary key);

    2:创建表后增加约束

      alter table temp1 add constraint PK_temp1 primary key(row_id );

  为了实施逻辑主键的唯一约束,SQL Server 会在后台创建一个唯一索引(Unique Index)。唯一索引是SQL Server实施唯一约束而采用的一种物理机制。

二:唯一约束(Unique Constraints)

  唯一约束用来保证数据行的一个列(或一组列)数据的唯一。

  约束的创建

    1:与主键约束不同,同一张数据表上可以创建多个唯一约束;

    2:唯一约束可以定义在NULL值列上;

    3:目前SQL Server 只支持在唯一约束列中,只能有一个列为NULL值列

  创建方法:

    alter table temp1 add constraint UC_temp1 unique (row_id);

  与主键约束一样,在创建唯一约束后,SQL Server会创建唯一索引以实施逻辑唯一约束的物理机制。

三:外键约束(Foreign Key Constraints)

  外键约束用于实施引用完整性。外键约束在引用表(referencing table )的一组属性上进行定义,且指向被引用表(referenced table)中的一组候选键(主键或唯一约束)。外键约束的目的是将外键列的值域控制在被引用列中现有的值。

  约束的创建:

    1:引用表和被引用表可以是同一张数据表;

    2:即使被引用的候选键不允许NuLL值,在外键中也可以允许为NULL值;

    3:可以在引用表上定义具有级联功能的外键。其目的是,当在对被引用表中的数据行进行删除(Delete)或更新(Update)操作时,可以自动对引用表中自动进行删除(Delete)或更新(Update)相关的数据行。

  创建方法:

    例如:在表A的ID列上定义一个外键约束,让它指向表B中的row_id 列

    Alter table A add constraint FK_A_ID Foreign key (ID) references B(row_id) [on delete cascade on update cascade];
    注:on delete 和 on update 为可选的定义选项,可定义的操作分为 CASCADE、Set Default、Set Null三种。

      cascade:操作(更新或删除)将被级联到引用表中相关数据行;

      set default:将更新引用表中相关数据行的值为默认值;

      set  null:将更新引用表中相关数据行的值为null值

  外键约束实施的引用操作成为“禁止操作(no action)”。禁止操作的含义为:当试图删除被引用表中的数据行或更新被引用表中的候选键时,如果在引用表中存在相关的数据行,则不允许此操作执行。

四:检查约束(Check Constraint) 

  检查约束用于定义在表中插入或更新一行数据之前必须满足的一个谓词(Check Expression) 。

  约束的创建

    当谓词返回的逻辑结果为False时,SQL Server将阻止本次对数据表的新增或更新操作;当谓词返回的逻辑结果为TRUE或者UNknown时,本次操作通过。

  创建方法

    Alter table temp1 add constraint CK_temp1 check (row_id <10000);  ----检查数据列 row_id,使其值不能大于10000

五:默认约束(Default Constraint)

  默认约束用来设置数据列的默认值。当对数据表新增一行记录时,如果没有为属性显示指定明确的值,默认约束将会为其自动设定为默认值。

  创建方法:

    Create table temp2(date1 datetime);  ---创建表Temp2

    ALter table temp2 add constraint DK_temp2 default (getdate()) for date1;  ---设置数据列 date1的默认值为当前服务器时间

    

SQL Server 数据完整性的实现——约束的更多相关文章

  1. SQL Server中使用Check约束提升性能

        在SQL Server中,SQL语句的执行是依赖查询优化器生成的执行计划,而执行计划的好坏直接关乎执行性能.     在查询优化器生成执行计划过程中,需要参考元数据来尽可能生成高效的执行计划, ...

  2. sql server删除主键约束所想到的

    从网上找到了下面一段代码: declare @Pk varchar(100);select @Pk=Name from sysobjects where Parent_Obj=OBJECT_ID('表 ...

  3. [置顶] T-sql sql server 设置主键约束、标示列、唯一约束、默认值、约束、创建表

    ----选择数据库 use ythome go ----查看表是否存在 if Exists ( select * from sysobjects where name='sys_menu' and t ...

  4. SQL Server查看表的约束

    sysobjects是系统自建的表,里面存储了在数据库内创建的每个对象,包括约束.默认值.日志.规则.存储过程等. SELECT * FROM sysobjects WHERE OBJECT_NAME ...

  5. SQL Server 禁止和启用约束

    Alter Table XXX nocheck constraint xxx Alter Table XXX check constraint xxx

  6. Sql Server约束的学习一(主键约束、外键约束、唯一约束)

    一.约束的分类 1.实体约束 实体约束是关于行的,比如某一行出现的值不允许出现在其他行,例如主键约束. 2.域约束 域约束是关于列的,对于所有行,某一列有那些约束,例如检查约束. 3.参照完整性约束 ...

  7. SQL Server中有关约束(constraint)的一些细节

    本文出处:http://www.cnblogs.com/wy123/p/7350265.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

  8. 使用SQL脚本创建数据库,操作主键、外键与各种约束(MS SQL Server)

    在实际开发中,可能很少人会手写sql脚本来操作数据库的种种.特别是微软的MS SQL Server数据库,它的SQL Server Management Studio对数据库的图形化操作极致简便,从而 ...

  9. sql server 2008 数据库的完整性约束

    一.数据库完整性概述   1.数据库的完整性:   ①数据库的完整性是指数据的正确性和相容性 ②数据库完整性是防止不合语义或不正确的数据进入数据库 ③完整性体现了是否真实地反映现实世界   例:  学 ...

随机推荐

  1. 【基本数据结构】并查集-C++

    并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中.这一类问题近几年来反复出 ...

  2. Java中的Enumeration、Iterable和Iterator接口详解

    前言 在看各类Java书籍或者博文的时候,总是会遇到Enumeration.Iterable和Iterator这三个接口,如果对这几个接口不是很明白的话,总会让自己看着看着就迷惑了,正好这周末,抽空把 ...

  3. 个人永久性免费-Excel催化剂功能第28波-工作薄瘦身,安全地减少非必要冗余

    Excel催化剂在完善了数据分析场景的插件需求后,决定再补充一些日常绝大多数Excel用户同样可以使用到的小功能,欢迎小白入场,在不违背太多Excel最佳实践的前提下,Excel催化剂乐意为广大Exc ...

  4. Linux/Ubuntu正确卸载LXDE

    第一步: sudo apt-get remove lxde 第二步 sudo apt autoremove lxde

  5. JS系列1---节流,去抖(防抖)应用场景:intput请求优化,页面监听

    在项目开发过程中经常遇到在input的change事件中发起请求,将用户最新输入的字符作为data传给后台,但是如果用户的输入频率过高,或者用户输入的字符还未拼成一个完整的字词,这时候发起请求会浪费网 ...

  6. 2017day1

    http://www.cnblogs.com/alex3714/articles/5465198.html 四.Python安装 windows 1 2 3 4 5 6 7 1.下载安装包     h ...

  7. C语言中的“>>”和“

    先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如: int i = 1; i = i << 2; //把i里的值左移2位 也就是说,1的2进制是00 ...

  8. 必懂的webpack高级配置

    webpack高级配置 1.HTML中img标签的图片资源处理 使用时.只需要在html中正常引用图片即可.webpack就会找到对应的资源进行打包.并修改html中的引用路径 主要是将html中的i ...

  9. json与js对象间的转化

  10. myeclipse中更改默认jdk版本出错( Target is not a JDK root. System library was not found)

    原因是我的本地jdk版本是9.0,将jdk版本更改至8.0即可导入成功. jdk9.0导入myeclipse中去会有此类问题的发生,因此没有必要使用最新的jdk版本.