SQL Server 数据库之数据完整性
目录
~ 简述
~ 实体完整性
· 主键约束
· 唯一性约束
~ 域完整性
· 空值约束
· 默认约束
· 检查约束
~ 引用完整性
~ 删除和禁用约束
· 删除约束
· 禁用约束
简述
数据完整性是指数据库中数据在逻辑上的一致性、准确性、有效性和相容性。它包括实体完整性、参照完整性和用户自定义完整性。而在 SQL Server 中,数据完整性分为实体完整性、域完整性和引用完整性三类。
实体完整性
实体完整性又叫行完整性,它是指表中的每一个记录都能唯一标识,且不存在重复的记录。可以通过主键约束和唯一性约束来实现实体完整性。
主键约束
主键约束强制要求被设置成主键的列取值不能为空,也不能重复。它通过PRIMARY KEY
子句来实现主键的声明。可以在 CREATE TABLE
或 ALTER TABLE
语句中使用PRIMARY KEY
子句,实现主键约束的创建、删除或修改。一个表中只能有一个主键,即只能设置一个主键约束对象。
代码示例
/*------------------------------------创建时,设置单属性主键*/CREATE TABLE Student(StudentID NCHAR(10) PRIMARY KEY,Name NCHAR(6),Sex NCHAR(2))/*------------------------------------创建时,设置联合主键*/CREATE TABLE Student(StudentID NCHAR(10),Name NCHAR(6),Sex NCHAR(2),CONSTRAINT PK_Name2 PRIMARY KEY(StudentID, Name) /*声明联合主键*/)/* PS:联合主键是由多个属性组成一个主键。主键只有一个,并不是多个 *//* PK_name 是主键约束对象的名字 *//*------------------------------------修改时,设置单属性主键*/ALTER TABLE StudentADD myname NCHAR(4) PRIMARY KEY,mysex NCHAR(2)/*------------------------------------修改时,设置联合主键*/ALTER TABLE StudentADD myname NCHAR(4),mystid NCHAR(4),mysex NCHAR(5),CONSTRAINT PK_name PRIMARY KEY(myname, mystid)
PS:主键约束会自动在指定列上创建一个唯一索引,默认是聚集索引,但可以指定主键对应的索引为非聚集索引。
唯一性约束
主键约束一个表只能有一个,但很多时候我们需要除了主键列以外的列没有重复值。这就用到了唯一性约束。唯一性约束与主键约束的效果基本相同,但一个表可以由多个唯一性约束。它通过 UNIQUE
子句来实现唯一性约束的声明,可以在 CREATE TABLE
或 ALTER TABLE
语句中使用UNIQUE
子句,实现主唯一性约束的创建、删除或修改。
唯一性约束可以允许值为 NULL
,单不允许值重复,包括重复的NULL
。
代码示例
/*------------------------------------创建时,设置唯一性约束*/CREATE TABLE Student(StudentID NCHAR(10) PRIMARY KEY,Name NCHAR(6) UNIQUE,Sex NCHAR(2),SchoolID NCHAR(2) UNIQUE,--这种创建方法,唯一性约束以多个键对象的形式存在--)/*------------------------------------创建时,设置唯一性约束*/CREATE TABLE Student(StudentID NCHAR(10) PRIMARY KEY,Name NCHAR(6),Sex NCHAR(2),SchoolID NCHAR(2),CONSTRAINT ue_name UNIQUE(Name, SchoolID) --唯一性约束以一个键对象的形式存在--)/*------------------------------------修改时,设置唯一性约束*/ALTER TABLE StudentADD myname NCHAR(4) UNIQUE,mysex NCHAR(4),/*------------------------------------修改时,设置唯一性约束*/ALTER TABLE StudentADD myname NCHAR(4),myscid NCHAR(2),mysex NCHAR(4),CONSTRAINT UN_name UNIQUE(myname, myscid)
PS:同主键约束一样,唯一性约束也会自动创建一个唯一性索引,但默认是非聚集索引,可以指定为聚集索引
域完整性约束
域完整性约束又叫列完整性约束,是指数据集对某一列是否有效和确定,是否允许为空值,通常通过空值约束、默认约束和检查约束来实现域完整性约束。
空值约束
即设置列是否可以为空值,通过 NULL
或NOT NULL
来声明列是否可以为空值,可以在CREATE TABLE
或 ALTER TABLE
语句中使用NULL
或NOT NULL
子句,实现空值约束的创建、删除或修改。
代码示例
/*------------------------------------创建时,设置空值约束*/CREATE TABLE Student(StudentID NCHAR(10) PRIMARY KEY,Name NCHAR(4) NOT NULL, --设置不能为空--Age INT NULL --设置可以为空--)/*------------------------------------修改时,设置空值约束*/ALTER TABLE StudentADD Sex NCHAR(4) NULL
PS:主键约束会自动要求不能为NULL,相当于自动设置了 NOT NULL
默认约束
默认约束,即为列设置默认值。通过DEFAULT
子句来为列设置默认值,可以在CREATE TABLE
或 ALTER TABLE
语句中使用DEFAULT
子句,实现默认约束的创建、删除或修改。
代码示例
/*------------------------------------创建时,设置默认约束*/CREATE TABLE Student(StudentID NCHAR(10) PRIMARY KEY,Name NCHAR(6) DEFAULT('阿珍'),Sex NCHAR(2) DEFAULT('女'),)/*------------------------------------创建时,设置默认约束*/CREATE TABLE Student(StudentID NCHAR(10) PRIMARY KEY,Name NCHAR(6),Sex NCHAR(2),CONSTRAINT Fe_name DEFAULT '女' FOR Sex)/*------------------------------------修改时,设置默认约束*/ALTER TABLE StudentADD Hobby NCHAR(4) DEFAULT('吃')/*------------------------------------修改时,设置默认约束*/ALTER TABLE StudentADD Hobby1 NCHAR(4),Hobby2 nchar(2),CONSTRAINT DF_name DEFAULT '玩' for Hobby1
PS:允许使用一些系统函数的返回值充当默认值
检查约束
检查约束就是为列设置取值范围,规定数据的值域。可以在CREATE TABLE
或 ALTER TABLE
语句中使用DEFAULT
子句来实现检查约束的创建。
代码示例
/*------------------------------------创建时,设置检查约束*/CREATE TABLE myinto(Name NCHAR(4),Sex NCHAR(1) CHECK(Sex='男' or Sex='女'),--括号内可以是一个表达式--Hobby NCHAR(10) NULL,)/*------------------------------------创建时,设置检查约束*/CREATE TABLE myinto(Name NCHAR(4),Sex NCHAR(1),Hobby NCHAR(10) NULL,CONSTRAINT CK_name CHECK(Sex='男' or Sex='女')--一个约束对象只能检查一个列--)/*------------------------------------修改时,设置默认约束*/ALTER TABLE myintoADD Lover NCHAR(2) CHECK(Lover='阿珍' or Lover='阿强')/*------------------------------------修改时,设置默认约束*/ALTER TABLE myintoADD Lover NCHAR(2),Lover_name NCHAR(1),CONSTRAINT CK_name CHECK(Lover='阿珍' or Lover='阿强')
PS:一个列上可以有多个检查约束,且检查约束可以参考本表中的其他列
引用完整性
引用完整性也成为参照完整性约束或外键约束等,它保证主键和外部键的关系总是得到维护,其中主键在被参照表中(也成为主键表),外部键在参照表中(也成为外键表)。
通过定义外键约束来实现引用完整性。外键约束定义一个列或多个列,这些列可以参照当前表或其他表的主键或UNIQUE约束列,通过设置外键约束可以实现表和表之间的依赖关系。外键约束可以在CREATE TABLE
或 ALTER TABLE
语句中使用FOREIGN KEY
和REFERENCES
子句创建。
外键约束有两种规则:更新规则(ON UPDATE)和删除规则(ON DELETE),两种规则又共用四种模式:不执行任何操作(NO ACTTON)、级联(CASCADE)、置空(SET NULL)和设置默认值(SET DEFAULT)。下面将一一介绍这四种模式。
- 不执行任何操作(NO ACCTTON)
这是默认值,当没有对两种规则指定模式时,就会默认模式为 NO ACTTON。在该模式下,要求外键列(参照列)不能插入或修改成主键列(被参照列)没有的值(删除不受影响);主键表不能修改涉及外部键值记录的主键值,不能删除涉及外部键值的记录(插入不受影响)。 - 级联(CASCADE)
这种模式要求外键列不能插入或修改成主键列没有的值(删除不受影响),且随着主键值的修改,相应的外部键值同步修改,随着主键表行的删除,相应的外键表行也同步删除(主键表插入不受影响)。 - 置空(SET NULL)
该模式要求,外键列不能插入或修改成 主键列没有的值(但删除不影响),且随着主键值的修改或删除(行),相应的外部键值置空(主键表插入不影响)。 - 设置默认值(SET DEFAULT)
该模式要求,外键列不能插入或修改成 主键列没有的值(但删除不影响),且随着主键值的修改或删除(行),相应的外部键值被设置成默认值(主键表插入不影响)。
值得注意的是,如果没有对外键列设置默认约束,则默认值为NULL
,如果设置了默认值约束,则该默认值必须是被参照列中的某一个数据项,否则在插入默认值时会失败(外键列不能插入或修改成主键列没有的值)。
示例代码
/*------------------------------------创建时,设置外键约束*/
CREATE TABLE Course
(
Coid INT PRIMARY KEY,
Coname NCHAR(10),
Coclass NCHAR(15)
)
CREATE TABLE Student
(
Stid INT PRIMARY KEY,
Name NCHAR(10) NOT NULL,
Coid INT FOREIGN KEY REFERENCES Course(Coid) ON UPDATE SET NULL ON DELETE SET NULL
--定义外键约束,并设置成‘设置控制’模式--
)/*------------------------------------修改时,设置外键约束*/
ALTER TABLE Student
ADD Coid INT,
CONSTRAINT CE_name FOREIGN KEY(Coid) REFERENCES Course(Coid) ON UPDATE CASCADE ON DELETE CASCADE
--设置成级联模式--
PS:如果删除的表设置有外键关系,则必须先删除参照表(外键表),再删除被参照表(主键表)
删除和禁止约束
删除约束
可以在ALTER TABLE
语句中删除约束,但前提是你知道约束对象的名字。代码如下
ALTER TABLE MytableDROP CONSTRAINT constraint_name
在创建约束约束时可以用CONSTRAINT
子句定义约束对象名,对于没有定义的约束对象,系统会自动为其分配一个名字,其格式为:约束类型简称_表名_列名_代号
。
禁用约束
一般情况下,我们在 ALTER TABLE
语句中对一个表添加约束后,系统会自动检查表中已经存在的数据是否满足该约束。但在一些特殊情况时,我们不想要改变表中已存在的数据,只想对新的数据进行约束,这时候就需要在已有数据上禁用约束。
想要禁止约束应用在已有数据上需要在创建约束的语句前加WITH NOCHECK
,如下
ALTER TABLE Student
WITH NOCHECK --对已有数据禁用约束--ADD CONSTRAINT CK_name CHECK (stid > 10000)
PS:1、只能禁用检查约束(CHECK)和外键约束应用在已有数据上
2、使用 WITH NOCHECK
创建的约束会对之后插入或更新的数据产生约束,包括对已有数据的更新
SQL Server 数据库之数据完整性相关推荐
- 1 SQL server数据库基础
SQL server数据库基础 一 数据库简介 1数据库的基本概念 1)数据 ·描述事物的符号记录称为数据(Data),包括数字.文字.图像.声音等.以"记录"的形式按统一格式进行 ...
- 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)
转http://www.cnblogs.com/zhijianliutang/p/4100103.html 前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的 ...
- Sql Server数据库备份和恢复:原理篇
本文与您探讨为什么Sql Server有完整备份.差异备份和事务日志备份三种备份方式,以及为什么数据库又有简单模式.完整模式和大容量日志模式这三种恢复模式.本文内容适用于2005以上所有版本的Sql ...
- sql server数据库的部署
http://xiaorenwutest.blog.51cto.com SQL Server数据库部署 概述:数据库在企业中现在是必不可少的存储工具,用来会员登录,网站 ...
- 5、SQL Server数据库、T-SQL
SQL Server数据库基础 一.安装SQL Server数据库 setup.exe->安装->全新SQL Server独立安装或向现有安装添加功能->输入序列号->下一步- ...
- SQL Server 数据库原理与应用
1. 数据库概述 名词解释: DB:数据库 DBMS:数据库管理系统 DBS:数据库系统 DBA:数据库管理员 DBAS:数据库应用系统 数据管理的三个阶段:人工管理.文件系统阶段.数据库系统阶段. ...
- SQL Server数据库迁移–将数据库克隆到另一个排序规则
Database migration is a vital task in any environment, complex or otherwise. Seamless migrations are ...
- SQL Server数据库的管理及维护
理论: 首先打开 SSMS(SQL server Management Studio) 使用SSMS可以实现好多功能:注册服务器,连接到数据库引擎,配置服务器的属性,创建对象,管理文件和文件组,附加或 ...
- SQL Server 数据库词汇表
SQL Server 数据库词汇表 词汇 词义 Activation 激活 ActiveX Data Objects(ADO) ActiveX 数据对象 ActiveX Data Objects(Mu ...
- Sql Server数据库的备份和恢复措施
Sql Server数据库的备份和恢复措施 Sql Server数据库的备份和恢复措施 一.备份数据库 1.打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL S ...
最新文章
- PHP array_merge() 函数
- SpringMVC原理及非注解配置详解
- java 计算随机数_JAVA获取随机数
- ef6 oracle 存储过程,具有多个结果集的存储过程-EF6 | Microsoft Docs
- jar包上传到jcenter
- 清理操作系统垃圾批处理文件
- csgo躲猫猫模式显示服务器已满,csgo躲猫猫攻略大全
- 第一章: 当前主流的小型嵌入式 GUI
- HTML5和CSS3新增
- c语言中的正号运算符,C语言 运算符
- Docker 配置镜像加速器
- 评价系统海量数据存储设计
- cython 安装升级_浅尝Kivy
- 旧电脑升级Win11
- outlook 2007 激活方法
- 工业智能网关BL110应用之九十三: 实现西门子S7-1500 PLC接入OPC UA云平台
- java B2B2C Springcloud电子商城系统--------负载均衡(Load Balance)
- 初创企业墓志铭:创业死亡榜背后的逻辑
- Windows 内存详解(三)Windows内存管理
- PMP认证需具备哪些条件啊?费用多少啊?
热门文章
- RecyclerView或是ListView(列表)点击某个条目保持选中【非常巧妙】
- ECCV 2022 | 悉尼大学提出:绝对尺度感知,鲁棒,以及可泛化的自监督单目深度估计网络DynaDepth
- bzoj 3505: [Cqoi2014]数三角形 组合数学
- 【并发编程】当我们谈论线程安全时我们在谈论什么
- android自定义秒表,Android:一个简单的秒表实现
- 数据挖掘概念与技术——读书笔记(1)
- STM32F103ZET6【标准库函数开发】----- 04串口4的IO口收发数据实验测试
- 如何解决 Elasticsearch 中未分配的分片
- c语言母亲节算法,用Excel推算母亲节日期,能理解最后一种算法的是高手!
- 百度地图api设置点的自定义图标不显示