资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,Copyright2008,1,第5章 实现数据完整性,数据完整性的类型,约束,禁用约束,默认值和规则,决定使用何种强制方法,推荐操作,第5章 实现数据完整性数据完整性的类型,数据完整性的类型,域完整性,(,列,),实体完整性,(行),参照完整性(表之间),数据完整性的类型域完整性(列)实体完整性(行)参照完整性,数据完整性的类型,4.1,数据完整性的类型,数据完整性,指的是数据库中存储的数据的一致性和准确性,数据完整性的类型:域完整性、实体完整性、引用完整性,域完整性,域(或列)完整性是指对列指定一组有效的值并决定是否可为空值,实体完整性,实体(或表)完整性要求表中的所有行都有一个惟一的标识符,称为主键值,引用完整性,引用完整性确保主键(在被引用表中)和外键(在引用表中)之间的关系得到保持,数据完整性的类型4.1 数据完整性的类型数据完整性,第5章 实现数据完整性,数据完整性的类型,约束,禁用约束,默认值和规则,决定使用何种强制方法,推荐操作,第5章 实现数据完整性数据完整性的类型,决定使用何种约束,约束的类型,约束,4.2,约束,决定使用何种约束约束4.2 约束,决定使用何种约束,4.2.1,决定使用何种约束,完整性类型,约束类型,描述,域,DEFAULT,如果在,INSERT,语句中未显式提供值,则指定为列提供的值,CHECK,指定列中可接受的数据值,REFERENTIAL,(,通常使用外键,),基于其他表中的列的值,指定可接受的用于更新的数据值,实体,PRIMARY KEY,惟一标识每一列,确保用户没有输入重复的值。同时创建一个索引以增强性能。不允许空值,UNIQUE,确保在非主键列中不输入重复值,并创建一个索引以增强性能。允许空值,引用,FOREIGN KEY,定义一列或多列的值与同表或其他表中主键的值匹配,CHECK,基于同表中其他列的值,指定列中可接受的数据值,决定使用何种约束4.2.1 决定使用何种约束完整性类型约束,创建约束,使用,CREATE TABLE,或者,ALTER TABLE,CREATE TABLE,是在创建表时创建约束,ALTER TABLE,是在一个已有的表上创建约束,可以添加约束到已有数据的表上,可添加单列或多列约束,若约束应用于单列,称为,列级约束,若约束引用了多列,称为,表级约束,,即使它并没有引用表中的所有列,4.3.2 创建约束,创建约束使用 CREATE TABLE 或者 ALTER T,使用约束的注意事项,可直接在表上创建、更改和删除约束,而不必删除并重建表,应该在应用程序和事务内建立错误检查逻辑,以测试是否违反了某个约束,SQL Server,里的约束只是“最后防线”,当给一个表添加约束的时候,,SQL Server,将检查现有数据是否违反约束,建议创建约束的时候指定名称,否则系统将为约束自动产生一个复杂的名称,名称必须惟一,且符合,SQL Server,标识符的规则,查看约束的信息,系统存储过程:,sp_helpconstraint,、,sp_help,信息模式视图:,check_constraints,、,referential_constraints,、,table_constraints,系统表:,syscomments,、,sysreferences,、,sysconstraints,使用约束的注意事项可直接在表上创建、更改和删除约束,而不必删,约束的类型,DEFAULT,约束,CHECK,约束,PRIMARY KEY,约束,UNIQUE,约束,FOREIGN KEY,约束,级联引用完整性,4.2.2,约束的类型,约束的类型DEFAULT 约束4.2.2 约束的类型,PRIMARY KEY,约束,PRIMARY KEY,约束在表中定义了一个惟一标识每一列的主键,语法:,CONSTRAINT,约束名,PRIMARY KEY CLUSTERED|NONCLUSTERED (,列,.,n,),4.2.2.3 PRIMARY KEY,约束,PRIMARY KEY 约束PRIMARY KEY 约束在表,PRIMARY KEY,约束利用表中的一列或多列数据唯一地标识某一行数据,每个表只有一个,PRIMARY KEY,约束,PRIMARY KEY,约束的值必须是唯一的,不允许有空值,SQL Server,中最多可定义 16 列作为主键,PRIMARY KEY,约束,PRIMARY KEY约束利用表中的一列或多列数据唯一地标,直接在列名后增加关键字,PRIMARY KEY,CREATE TABLE Student,(,sno char(5),PRIMARY KEY,sname varchar(20)not null,);,列级主键,创建,sc,表,其主码为(,sno,cno),?,CREATE TABLE sc,(sno char(5)PRIMARY KEY,,cno char(1)PRIMARY KEY,,grade decimal(4,1),;,PRIMARY KEY,约束,直接在列名后增加关键字 PRIMARY KEY列级主键 创建,在,CREATE TABLE,语句各列定义的最后加:,PRIMARY KEY,(),CREATE TABLE sc,(sno char(5),,cno char(1),,grade decimal(4,1),PRIMARY KEY(sno,cno),),;,CREATE TABLE sc1,(.,constraint PK_SC PRIMARY KEY(sno,cno),);,表级主键,约束名,PRIMARY KEY,约束,在CREATE TABLE语句各列定义的最后加:CREA,删除表上已定义的主键,ALTER TABLE,SC1,DROP CONSTRAINT,PK_SC;,在没有定义主键的表上,加上一个主键,ALTER TABLE,SC,ADD CONSTRAINT,PK_SC,primary key,(sno,cno);,删除和添加主键,删除表上已定义的主键删除和添加主键,DEFAULT,约束,如果一个列的值在,INSERT,语句中没有指定,,DEFAULT,约束将自动输入一个值,可以是预先指定的常量、,NULL,或者一个系统函数运行时的值,语法:,CONSTRAINT,约束名,DEFAULT,约束表达式,创建,DEFAULT,约束的两种方法,创建一个默认对象(,CREATE DEFAULT),,然后使用存储过程,sp_bindefault,将默认绑定到一个列,CREATE TABLE,或,ALTER TABLE,时使用,DEFAUTL,约束,4.2.2.1 DEFAULT,约束,DEFAULT 约束如果一个列的值在 INSERT 语句中没,DEFAULT,约束(续),在创建表时使用,default,属性,4.2.2.1 DEFAULT,约束,CREATE TABLE userInfo,(.,country varchar(50)not null,DEFAULT,China ,),为已经创建好的表添加,default,属性,USE NorthwindALTER TABLE dbo.CustomersADD,CONSTRAINT,DF_contactname,DEFAULT,UNKNOWN FOR ContactName,应用,DEFAULT,约束的几种情况,DEFAULT 约束(续)在创建表时使用default属性4,DEFAULT,约束(续),应用,DEFAULT,约束的注意事项,允许使用常量、函数、系统提供的值:,USER,、,CURRENT_USER,、,SESSION_USER,、,SYSTEM_USER,及,CURRENT_TIMESTAMP,例如:,DEFAULT USER DEFAULE (getdate(),有可能会和,CHECK,约束冲突,常量值外面可以加或者不加括号,字符或者日期常量必须加上单引号或双引号,4.2.2.1 DEFAULT,约束,忽略,不显式地插入值,插入,NULL,插入,DEFAULT,无默认值,有默认值,无默认值,有默认值,无默认值,有默认值,NULL,NULL,默认值,NULL,NULL,NULL,默认值,NOT NULL,错误,默认值,错误,错误,错误,默认值,DEFAULT 约束(续)应用 DEFAULT 约束的注意事,CHECK,约束,限制输入到指定列的值只能为某些特定值,语法:,CONSTRAINT,约束名,CHECK(,逻辑表达式,),两种强制域完整性的方法:,CHECK,约束和规则,CHECK,约束定义了一个表达式,若数据修改语句使得表达式值为,FALSE,的话,将拒绝语句执行,规则的功能和,CHECK,约束基本相同,除了语法不同,能力稍弱。,规则可定义一次,然后对多个列分别绑定;而,CHECK,约束则需要对每个列定义。但,CHECK,约束的功能略强一些(例如引用同行中其他列的值和调用系统函数等),4.2.2.2 CHECK,约束,CHECK 约束限制输入到指定列的值只能为某些特定值4.2.,CHECK,约束(续),应用,CHECK,约束的几种情况,4.2.2.2 CHECK,约束,USE NorthwindALTER TABLE dbo.EmployeesADD,CONSTRAINT,CK_birthdate,CHECK,(BirthDate 01-01-1900 AND BirthDate 01-01-1900 AND BirthDate=0 and grade=0 and grade=0 and grade=100),);,创建,CHECK,约束,表级,CHECK,约束,Create Table SC 创建CHECK 约束表级CH,Create Table Student,(sno char(5)not null,birthdate datetime not null,schooldate datetime not null,primary key(sno),);,创建,CHECK,约束,表级,CHECK,约束,check(birthdate getdate(),check(birthdate=0 and gmark=100),添加和删除,CHECK,约束,删除SC表中的 CHECK 约束 添加和删除CHECK 约束,CHECK,约束(续),应用,CHECK,约束的注意事项,一个表可以定义多个,CHECK,约束,一个列上只允许创建一个列级,CHECK,约束。,列级,CHECK,约束只能引用被约束的列,表级,CHECK,约束只能引用同一表中的列。,当列上存在规则和一个或多个,CHECK,约束时,将验证所有限制。,4.2.2.2 CHECK,约束,CHECK 约束(续)应用CHECK 约束的注意事项4.2.,UNIQUE,约束,UNIQUE,约束指明列中的任意两行不能有相同的值,语法:,CONSTRAINT,约束名,UNIQUE CLUSTERED|NONCLUSTERED (,列,.,n,),应用,UNIQUE,约束的注意事项,允许空值的列上定义,UNIQUE,约束,在一个表上允许多个,UNIQUE,约束,可在一个或者多个列上定义,是通过一个惟一索引强制约束的,4.2.2.4 UNIQUE,约束,UNIQUE 约束UNIQUE 约束指明列中的任意两行不能有,UNIQUE,约束(续),PRIMARY KEY,和,UNIQUE,约束,声明,PRIMARY KEY,或,UNIQUE,约束的结果只是自动创建了一个指定列上的惟一索引,通过惟一索引来确保值的惟一性,可空性,PRIMARY KEY,的各个列必须声明为,NOT NULL,,而,UNIQUE,的各个列可以声明为允许,NULL,值,在惟一索引中,认为所有的,NULL,值是相等的,索引的属性,PRIMARY KEY,约束所创建的惟一索引默认
展开阅读全文