1数据完整性感慨
(1)实体完整性
实体完整性规定表的每一行在表中是唯一的。实体表中定义的索引、UNIQUE约束、PRIMARY KEY约束和IDENTITY属性就是实体完整性的体现。
(2)域完整性
域完整性是指数据库表中的列必须满足某种特定的数据类型或约束,其中约束又包括取值范围和精度等规定。表中的CHECK约束、FOREIGN KEY约束、DEFAULT定义、NOT NULL等都属于域完整性的范畴。
(3)引用完整性
引用完整性是指两个表的主关键字和外关键字的数据应对应一致。它确保了有主关键字的表中对应其他表的外关键字的行存在,保证了表之间的数据的一致性,防止数据丢失或无意义的数据在数据库中扩散。引用完整性是创建在外关键字和主关键字之间或外关键字和唯一性关键字之间的关系上的。引用完整性时,SQL Server将阻止用户执行下列操作;
<1>在主表中没有关联的记录时,将记录添加或更改到相关表中;
<2>更改主表中的值,这会导致相关表中生成孤立记录;
<3>从主表中删除记录,但仍存在与该记录匹配的相关记录;
FOREIGN KEY和CHECK约束可以实现引用完整性。
(4).用户定义完整性
用户定义完整性指的是由用户指定的一组规则,它不属于实体完整性、域完整性或引用完整性。CREATE TABLE中的所有列级和表级约束、存储过程和触发器都属于用户完整性。
2.列约束和表约束
对数据库来说,约束分为列约束和表约束。其中列约束作为列定义的一部分只作用于此列本身,表约束作为表定义的一部分可以作用于多个列。
CREATE TABLE Goods( g_ID char(6), g_Name varchar(50), t_ID char(2) REFERENCES Types(t_ID), --列约束 g_Price float, g_Discount float, g_Number smallint, g_ProduceDate datetime DEFAULT '2007-07-01', --列约束 g_Image varchar(100), g_Status varchar(10), g_Description varchar(1000) CONSTRAINT pk_gID PRIMARY KEY(g_ID) --表约束 )
【提示】
- 添加约束可以使用CREATE TABLE在创建表时创建,也可以使用ALTER TABLE修改表时进行添加。
- ALTER TABLE添加约束时,使用WITH NOCHECK选项可以实现对表中已有的数据不强制应用约束(CHECK和FOREIGN KEY)。
- ALTER TABLE添加约束时,使用NOCHECK选项可以实现禁止在修改和添加数据时应用约束(CHECK和FOREIGN KEY)。
- 删除约束只能使用ALTER TABLE语句完成。
3.允许空值约束
在使用CREATE TABLE创建表和使用ALTER TABLE修改表时,都可以创建NOT NULL约束。
CREATE TABLE Goods( g_ID char(6) NOT NULL, g_Name varchar(50) )
ALTER TABLE Goods ALTER COLUMN g_Name varchar(50) NOT NULL
4.DEFAULT定义
格式如下:
DEFAULT 默认值
可以通过在CREATE TABLE语句或ALTER TABLE语句中使用NOT NULL关键字来实现。
CREATE TABLE Goods( g_ProduceDate datetime DEFAULT '2007-07-01', )
【提示】
- 若要修改DEFAULT定义,必须首先删除现有的DEFAULT定义,然后重新创建。
- 默认值必须与要应用DEFAULT定义的列的数据类型相配。
- 可以使用getdate()函数替代“2007-07-01”,的、表示默认使用系统当天日期。
5.CHECK约束
格式如下:
CONSTRAINT 约束名 CHECK (表达式)
使用T-SQL语句CREATE TABLE和ALTER TABLE可以定义CHECK约束。
ALTER TABLE Goods WITH NOCHECK ADD CONSTRAINT ck_Discount CHECK(g_Discount>=0.5 AND g_Discount<=1.0 )【提示】
- 也可以使用CREATE TABLE语句在创建表时指定约束。
- 可以使用“ALTER TABLE Goods DROP CONSTRAINT ck_Discount”删除名称为ck_Discount的CHECK约束。
- 可以将多个CHECK约束应用于单个列。
- 可以通过在表级创建CHECK约束,将一个CHECK约束应用于多个列。
- CHECK约束不接受计算结果为False的值。
- 在执行添加和修改记录语句时验证CHECK约束,执行删除记录语句时不验证CHECK约束。
6.PRIMARY KEY约束
格式如下:
CONSTRAINT 约束名 PRIMARY KEY(列或列的组合)
表通常具有包含唯一标识表中每一行的值的一列或多列,这样的一列或多列称为表的主键(PK),用于强制表的实体完整性,PRIMARY KEY约束通过创建唯一索引保证指定列的实体完整性。使用PRIMARY KEY约束时,列的空值属性必须定义为NOT NULL。PRIMAARY KEY约束可以应用于表中的一列或多列。
CREATE TABLE Goods( g_ID char(6) PRIMARY KEY, g_Name varchar(50), t_ID char(2), g_Price float, g_Discount float, g_Number smallint, g_Image varchar(100), )
复合主键
CREATE TABLE OrdderDetails( o_ID char(14), g_ID char(6), d_Price float, d_Number smallint CONSTRAINT pk_d_o_ID PRIMARY KEY(o_ID,g_ID) )
【提示】
- 一个表只能有一个PRIMARY KEY约束,并且PRIMARY KEY约束中的列不能接受空值。
- 如果为表指定了PRIMARY KEY约束,则SQL Server 2008数据库引擎将通过为主键列创建唯一索引来强制数据的唯一性。当在查询中使用主键时,此索引还可用来对数据进行快速访问。
- 如果对组合列定义了PRIMARY KEY约束,则组合列中的某一列的值可能会重复,但来自PRIMARY KEY约束定义中所有列的任何值组合必须唯一。
7.FOREIGN KEY约束
格式如下:
CONSTRAINT 约束名 FOREIGN KEY(列) REFERENCES 被引用表(列)
FOREIGN KEY约束为表中一列或多列数据提供引用完整性,它限制插入到表中被约束列的值必须在被引用表中已经存在。
CREATE TABLE Goods( g_ID char(6) PRIMARY KEY, g_Name varchar(50), t_ID char(2) REFERENCES Types(t_ID), g_Price float, g_Discount float, g_Number smallint, g_ProduceDate datetime DEFAULT '2007-07-01', g_Image varchar(100), g_Status varchar(10), g_Description varchar(1000) )
【提示】
- 必须先创建好Types表。
- 必须创建好Types表中基于t_ID列的主键。
- 创建FOREIGN KEY时,必须建立好相应的主键约束或UNIQUE约束。
- FOREIGN KEY约束并不仅仅可以与另一表的PRIMARY KEY约束相链接,它还可以定义为引用另一表的UNIQUE约束。
- FOREIGN KEY约束也可以引用同一数据库的表中的列或同一表中的列。
- 表中包含的FOREIGN KEY约束不要超过253个,并且引用该表的FOREIGN KEY约束也不要超过253个。
- ON UPDATE CASCADE:更新
- ON DELETE CASCADE:删除
8.UNIQUE约束
格式如下:
CONSTRAINT 约束名 UNIQUE(列或列的组合)
CREATE TABLE Goods( g_ID char(6) PRIMARY KEY, g_Name varchar(50) UNIQUE, t_ID char(2) REFERENCES Types(t_ID), g_Price float, g_Discount float, g_Number smallint, g_ProduceDate datetime DEFAULT '2007-07-01', g_Image varchar(100), g_Status varchar(10), g_Description varchar(1000) )
【提示】
- 使用UNIQUE约束和PRIMARY KEY约束都是强制唯一性,PRIMARY KEY约束自动使用UNIQUE约束,但只能使用在主键列。而使用UNIQUE约束可以在非主键列或允许空值的列上实现唯一性约束。
- 一个表可以定义多个UNIQUE约束,而只能定义一个PRIMARY KEY约束。
- 允许空值的列上可以定义UNIQUE约束,而不能定义PRIMARY KEY约束。
- FOREIGN KEY约束也可引用UNIQUE约束。
用ALTER TABLE语句添加列约束,使用ADD关键字。
ALTER TABLE Goods ADD UNIQUE(g_Name)用ALTER TABLE语句删除UNIQUE约束,使用DROP关键字。
ALTER TABLE Goods DROP UNIQUE(g_Name)