数据库中的完整性约束及实例

来源:互联网 发布:华为网络电话机 编辑:程序博客网 时间:2024/06/10 01:00
1 定义 
    数据完整性用于保证数据库中数据的正确性、一致性和可靠性。 
2    类型 
• 实体完整性(Entity Integrity) 
• 域完整性(Domain Integrity) 
• 参照完整性(Referential Integrity) 
• 用户定义完整性(User-defined Integrity) 
 图示 

实体完整性(Entity Integrity) 

实体完整性用于保证数据库中数据表的每一个特定实体的记录都是唯一的 。

  约束种类                                      功能描述
  PRIMARY KEY(主键)约束                         唯一识别每一条记录的标志,可以有多列共同组成
  IDENTITY(自增)约束                            列值自增,一般使用此属性设置的列作为主键
  UNIQUE(唯一)约束                              可以使用UNIQUE约束确保在非主键列中不存在重复值,但列值可以是NULL(空)

域完整性(Domain Integrity) 

域完整性是指保证指定列的数据具有正确的数据类型、格式和有效的数据范围。 

  CHECK(检查)约束                                用于限制列中值得范围
  FOREIGN KEY(外键)                              一个表中的FORENIGN KEY 指向另一个表中的PRIMARY KEY
  DEFAULT(默认值)约束                            用于向列中插入默认值
  NOT NULL(非空)约束                             用于强制列不接受NULL(空)值

参照完整性(Referential Integrity) 
当增加、修改或删除数据库表中记录时,可以借助参照完整性来保证相关联表之间数据的一致性 。
用户定义完整性 (User- defined Integrity) 

这是由用户定义的完整性。用户定义完整性可以定义不属于其他任何完整性分类的特定业务规则 。

注意:
1、PRIMARY KEY用于将表中的某类设置为主键,一张表中只有一个主键,主键可以是一列或由多列组成。
2、NOT NULL是对列值进行限制,即在表中添加数据时不允许有NULL值。
3、CHECK约束的语法规则:CHECK(表达式)
外键的使用:字段名 数据类型 [FOREIGN KEY] REFERENCES 表名(字段名) 

===================================

3 数据完整性的实现方式 


声明数据完整性和过程数据完整性 
(1)使用IDENTITY(标识符)列 
语法格式: 
CREATE TABEL 数据表名 
(列名 列数据类型 IDENTITY [(种子, 增量)] [,…]) 
说明:标识种子为标识列的起始值,标识递增量为每次增加的数,二者的默认值均为1。 
(2)使用IDENTITY函数 
语法格式: 
IDENTITY ( 数据类型 [ , 种子 , 递增量 ] ) AS 列名 
说明:只用在带有 INTO table 子句的 SELECT 语句中,可以将标识列插入到新表中。 
尽管类似,但是 IDENTITY 函数不是与 CREATE TABLE 和 ALTER TABLE 一起使用的 IDENTITY 属性。 

完整性类型 约束类型 描述 
域 DEFAULT 指定列的默认值 
CHECK 指定列的允许值 
FOREIGN KEY 指定必须存在值的列 
NULL 指定是否允许为NULL 
实体 PRIMARY KEY 唯一标识每一行 
UNIQUE 防止非主键重复 
引用 FOREIGN KEY 定义值与同一个表或另一个表的主键值匹配的一列或多列组合 
CHECK 指定根据同一个表中其他列的值可在列中接受的数据值 
      
在SQL SERVER中,对于基本表的约束分为列约束和表约束。 
完整性约束的基本语法格式为: 
         [CONSTRAINT constraint_name(约束名)] <约束类型> 
         约束不指定名称时,系统会给定一个名称。 
         在SQL Server 2005中有6种约束:主键约束(primary key constraint)、惟一性约束(unique constraint)、检查约束(check constraint)、默认约束(default constraint)、外部键约束(foreign key constraint)和空值(NULL)约束。 
PRIMARY KEY 约束 
PRIMARY KEY约束用于定义基本表的主键,它是惟一确定表中每一条记录的标识符,其值不能为NULL,也不能重复,以此来保证实体的完整性。PRIMARY KEY与UNIQUE约束类似,通过建立唯一索引来保证基本表在主键列取值的唯一性,但它们之间存在着很大的区别: 
①一个表只能有一个 PRIMARY KEY 约束 ,但可定义多个UNIQUE约束; 
②对于指定为PRIMARY KEY的一个列或多个列的组合,其中任何一个列都不能出现空值,而对于UNIQUE所约束的唯一键,则允许为空。 
注意:不能为同一个列或一组列既定义UNIQUE约束,又定义PRIMARY KEY约束; 
PRIMARY KEY既可用于列约束,也可用于表约束。 
(2)使用Transact-SQL语句操作法设置主键约束,其语法形式如下: 
   PRIMARY  KEY  
   CONSTRAINT  constraint_name  PRIMARY  KEY  ( column_name ) 
举例:建立一个SC表,定义SNO,CNO共同组成SC的主键 
程序清单如下: 
create table sc( 
     sno char(5) not null, 
cno char(5) not null, 
score numeric (3), 
constraint sc_prim primary key(sno,cno) 

UNIQUE约束 
         惟一性约束用于指定一个或者多个列的组合值具有惟一性,以防止在列中输入重复的值。定义了UNIQUE约束的那些列称为唯一键,系统自动为唯一键建立唯一索引,从而保证了唯一键的唯一性。 
当使用惟一性约束时,需要考虑以下几个因素: 
• 使用惟一性约束的字段允许为空值; 
• 一个表中可以允许有多个惟一性约束; 
• 可以把惟一性约束定义在多个字段上; 
• 惟一性约束用于强制在指定字段上创建一个惟一性索引; 
• 默认情况下,创建的索引类型为非聚集索引。 
使用Transact-SQL语句完成惟一性约束的操作,其语法形式如下: 
•     UNIQUE 
•     CONSTRAINT  constraint_name UNIQUE ( column_name ) 
CHECK 约束 
         检查约束对输入列或者整个表中的值设置检查条件,以限制输入值,保证数据库数据的完整性。 
当使用检查约束时,应该考虑和注意以下几点: 
• 一个列级检查约束只能与限制的字段有关;一个表级检查约束只能与限制的表中字段有关; 
• 一个表中可以定义多个检查约束; 
• 每个CREATE TABLE语句中每个字段只能定义一个检查约束; 
• 在多个字段上定义检查约束,则必须将检查约束定义为表级约束; 
• 当执行INSERT语句或者UPDATE语句时,检查约束将验证数据; 
• 检查约束中不能包含子查询。 
用Transact-SQL语句创建检查约束。其语法形式如下: 
•    CONSTRAINT  constraint_name  CHECK  (logical_expression) 
•    CHECK  (logical_expression) 
create table sc( 
     sno char(5) not null, 
cno char(5) not null, 
     score numeric(5,1) constraint score_chk check(score>=0 and score <=100), 
constraint sc_prim primary key(sno,cno), 
     

drop table sc 
insert into sc values('1','2',3) 
DEFAULT 约束 
         默认约束指定在插入操作中如果没有提供输入值时,则系统自动指定值。默认约束可以包括常量、函数、不带变元的内建函数或者空值。 
使用默认约束时,应该注意以下几点: 
(1)每个字段只能定义一个默认约束; 
(2)如果定义的默认值长于其对应字段的允许长度,那么输入到表中的默认值将被截断; 
(3)不能加入到带有IDENTITY属性或者数据类型为timestamp的字段上; 
(4)如果字段定义为用户定义的数据类型,而且有一个默认绑定到这个数据类型上,则不允许该字段有默认约束。 
创建默认约束的Transact-SQL语句操作法。其语法形式如下: 
•     CONSTRAINT  constraint_name  DEFAULT  constraint_expression  [FOR  column_name] 
•      DEFAULT  constraint_expression  [FOR  column_name] 
举例:为 dept字段创建默认约束。 
程序清单如下: 
constraint  con_dept  default  ‘计算机’  for  dept 
NULL 约束 
空值约束用来控制是否允许该字段的值为NULL。NULL值不是0也不是空白,更不是填入字符串的“NULL”字符串,而是表示“不知道”、“ 不确定”或“没有数据”的意思。 
       当某一字段的值一定要输入才有意义的时候,则可以设置为NOT NULL。如主键列就不允许出现空值,否则就失去了唯一标识一条记录的作用。空值约束只能用于定义列约束。 
FOREIGN KEY 约束 
     FOREIGN KEY约束是用于建立和加强两个表数据之间的链接的一列或多列。外部键约束用于强制参照完整性。 

FOREIGN KEY 约束确保同一个表或者不同表之间的引用完整性 
必须引用一个PRIMARY KEY或者UNIQUE约束 
用户必须在应用表上具有REFERENCES权限 
一个表中最多可以有31个外部键约束; 
在临时表中,不能使用外部键约束; 
主键和外部键的数据类型必须严格匹配 。 

使用Transact-SQL语句设置外部键约束 ,其语法形式如下: 
  CONSTRAINT  constraint_name 
  FOREIGN  KEY  (column_name[,…n]) 
  REFERENCES  ref_table  [(ref_column[,…n])] 
ALTER TABLE [Sales].[SalesOrderHeader]  WITH CHECK 
ADD CONSTRAINT [FK_SalesOrderHeader_Customer_CustomerID] 
FOREIGN KEY([CustomerID]) 
REFERENCES [Sales].[Customer] ([CustomerID]) 
禁用 CHECK 和 FOREIGN KEY 约束: 
 当运行大型批处理作业时提高性能 

 当向表中添加新的约束的时候避免检查已经存在的数据 

=============================

必须会的SQL语句:数据库的完整性约束 
实体完整性


1.建表时定义主键
  Create table 表名
   (
        Sno int identity(1,1),
        Sname nvarchar(20),
        --设置主键
        Primary key (Sno)
   )
 
2.添加主键
    alter table 表名
    add constraint PK_表名_Sno
    primary key(id)
 
参照完整性
 
1.建表时定义外键
  create table 表名
  (
      sno int identity(1,1) primary key,
      cno int not null,
      foreign key(cno) References
      表名2(Cno)
      on Delete cascade     --级联删除
      on update cascade    --级联更新
      -- on delete on action  删除管制
  )
 
2.添加外键
   alter table 表名
   add constraint FK_表名_表名2
   Foreign key(cid) references 表名2(cid)
 
用户定义完整性
 
1.非空约束
   alter table 表名
   alter column name varchar(20) not null
 
2.唯一约束
   alter table 表名
   add constraint UQ_表名_列名 unique(列)
 
3.检查约束
   alter table 表名
   add constraint CK_表名_列名 check(age>5)
 
4.默认约束
   alter table 表名
   add constraint DF_表名_列名 default('男')
   for gender
 
删除约束
    --删除约束
   alter table 表名 drop constraint DF_表名_列

ref:http://yinxiangbing.iteye.com/blog/673768
另可参考:http://blog.csdn.net/xiang462042190/article/details/40658427

http://www.cnblogs.com/sixbeauty/p/4016284.html

0 0