一、数据库完整性:
1. 数据库的完整性:
①数据库的完整性是指数据的正确性和相容性
②数据库完整性是防止不合语义或不正确的数据进入数据库
③完整性体现了是否真实地反映现实世界
2. DBMS维护数据库完整性机制:
①提供定义完整性约束条件的机制
DBMS应提供定义数据库完整性约束条件,并把它们存入数据库中。
②提供完整性检查的方法
检查数据是否满足完整性约束条件的机制称为完整性检查。一般在INSERT、UPDATE、DELETE语句执行后开始检查。
③违约处理
DBMS若发现用户的操作违背了完整性约束条件,就采取一定的动作以保证数据的完整性,如拒绝执行该操作,或级联执行其他操作。
3. 数据的完整性约束类型(按完整性类型分类):
4. 数据的完整性约束类型(按作用对象分类)
约束简介:
(1) 约束是通过限制列中、行中和表之间数据来保证数据完整性的非常有效的方法。
(2) 每一种数据完整性类型都由不同的约束类型来保障。
(3) 约束是强制数据完整性的首选方法。
注意:
(1) 直接在表上创建、更改和删除约束,而不必删除并重建表。
(2) 当给一个表添加约束的时候,SQL Server 将检查现有数据是否违反约束。
分类:
①表级完整性约束:与列定义相互独立,不包括在列定义中,通常用于对多个列一起进行约束,放在表定义的最后,有:
PRIMARY KEY主键约束,FOREIGN KEY外键约束,UNIQUE 唯一约束,CHECK检查约束
②列级完整性约束:作用于某一个特定列的约束,包含在列定义中,有:
PRIMARY KEY主键约束,FOREIGN KEY外键约束,UNIQUE 唯一约束,CHECK检查约束,DEFAULT 缺省约束,NULL/NOT NULL 空值/非空约束
二、约束
索引类型:
1. PRIMARY KEY主键约束(实体完整性)
使用注意点:
(1) 每张表只能有一个PRIMARY KEY约束
(2) 输入值的之必须是唯一的
(3) 不允许空值
(4) 可以是单个列或多个列(PRIMARY KEY(Sno,Cno))
(5) 将在指定列上创建唯一索引 (相关知识:)
(6) 不指定索引类型,且表内无聚集索引,则自动创建唯一的聚集索引(相关知识:)
SQL操作语句:
/*创建*/
CREATE TABLE DEPT
( Deptno NUMERIC(2) PRIMARY KEY, //列定义
Dname CHAR(9)
Location CHAR(10),
[CONSTRAINT 约束名] PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] (列[,...n] ) //表定义
);
/*添加*/
ALTER TABLE <表名> ADD [CONSTRAINT 约束名 ]
PRIMARY KEY [CLUSTERED | NONCLUSTERED ] (列[,...n])
2. UNIQUE唯一约束(实体完整性)
使用的注意点:
(1) 在一个表上允许多个UNIQUE约束
(2) 输入的值必须是唯一的
(3) 允许一个空值
(4) 可以是单个列或多个列(UNIQUE(Sno,Cno))
(5) 将在指定列创建一个唯一约束
SQL操作语句:
/*创建*/
CREATE TABLE DEPT
( Deptno NUMERIC(2),
Dname CHAR(9) UNIQUE, //列定义
Location CHAR(10),
PRIMARY KEY (Deptno),
[CONSTRAINT 约束名] UNIQUE [ CLUSTERED | NONCLUSTERED ] (列[,...n] ) //表定义
);
/*添加*/
ALTER TABLE <表名>
ADD [CONSTRAINT 约束名]
UNIQUE [ CLUSTERED | NONCLUSTERED ] (列[,...n] )
3. FOREIGN KEY外键约束(参照完整性)
使用的注意点:
(1) FOREIGN KEY子句中指定的列的个数和数据类型必须和参照列一致,且参照列必须有唯一索引(PRIMARY KEY或UNIQUE)
(2) 不自动创建索引
(3) 修改数据的时候,用户必须在被FOREIGN KEY约束引用的表上具有SELECT或REFERENCES权限(GRANT)
参照完整性检查:
FOREIGN KEY 约束包含一个 CASCADE 选项,允许对一个定义了 UNIQUE 或者 PRIMARY KEY 约束的列的值的修改自动传播到引用它的外键上,这个动作称为级联引用完整性。
SQL操作语句:
ALTER TABLE 表名
ADD [CONSTRAINT 约束名] [FOREIGN KEY] [(列[,…n])]
REFERENCES 表[(引用列 [,…n])]
[ ON DELETE { CASCADE | NO ACTION } ] [ ON UPDATE { CASCADE | NO ACTION } ]
/*
NO ACTION:任何企图删除或者更新被其他表的外键所引用的键都将引发一个错误,对数据的改变会被回滚。NO ACTION 是默认值
CASCADE:若父表中的行变化了,则引用表中相应的行也自动变化
*/
4. DEFAULT 缺省约束(域完整性)
使用的注意点:
(1) DEFAULT 约束只对 INSERT 语句有效,DEFAULT 约束创建时将不检查表中的现存数据
(2) 每列只能定义一个 DEFAULT 约束
(3) 常量值外面可以加或者不加括号,字符或者日期常量必须加上单引号或双引号
(4) 允许使用一些系统提供的值:USER,CURRENT_USER, SESSION_USER, SYSTEM_USER 及CURRENT_TIMESTAMP
(5) 有可能会和 CHECK 约束冲突
(6) 为具有 PRIMARY KEY 或 UNIQUE 约束的列指定默认值是没有意义的
(7) 不能放在有IDENTITY属性或数据类型为timestamp的列上。因为这两种列都会由系统自动提供数据。
创建的两种方法:
创建一个默认(CREATE DEFAULT),然后使用存储过程 sp_bindefault 将默认绑定到一个列
CREATE TABLE 或 ALTER TABLE 时使用 DEFAUTL 约束
这里只介绍后一种方法:
/*创建*/
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) default ‘男’,
Sage SMALLINT,
Sdept CHAR(20) ,
PRIMARY KEY (Sno)
);
/*添加*/
ALTER TABLE student
ADD CONSTRAINT DF_student_sex
DEFAULT '男' FOR Ssex
5. NULL/NOT NULL约束(域完整性)
/*创建*/
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20) ,
PRIMARY KEY (Sno)
);
/*添加*/
ALTER TABLE <表名>
ALTER COLUMN <列名> <数据类型> NOT NULL;
6. CHECK约束(域完整性)
使用的注意点:
(1) CHECK约束通过限制用户输入的值来加强域完整性。
(2) 它指定应用于列中输入的所有值的布尔(取值为TRUE或FALSE)搜索条件,拒绝所有不取值为TRUE的值。
(3) 可以为每列指定多个CHECK约束。
SQL的操作语句:
/*创建*/
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) default ‘男’,
Sage SMALLINT,
Sdept CHAR(20) ,
PRIMARY KEY (Sno),
CONSTRAINT CK_Student_Sex CHECK(Ssex IN(''女,'男'))
);
/*添加*/
ALTER TABLE student
ADD CONSTRAINT CK_Student_Sex
CHECK(Ssex IN(''女,'男'))
7. 禁用约束
(1) 注意事项:
- 只能禁用 CHECK 和 FOREIGN KEY 约束
- 当为一个已有数据的表添加 CHECK 或 FOREIGN KEY 约束的时候,使用 WITH NOCHECK 选项来禁用对已有数据的约束检查
- 当现有数据不再变化的时候,使用 WITH NOCHECK 选项。若数据被更新,则它的新值必须符合 CHECK 约束
- 确定禁用约束检查是恰当的。在决定添加约束前,可修改现有数据。
(2) 语法:
/*禁用现有数据上的约束检查*/
ALTER TABLE <表名>
[WITH CHECKWITH NOCHECK]
ADD CONSTRAINT 约束名
[FOREIGN KEY] [(column[,…n])] REFERENCES 引用表 [(引用列 [,…n])] [CHECK (搜索条件)]
(3) 举例
/*忽略之前不满足的数据*/
alter table People with nocheck --不检查之前数据
add constraint CK_People_Age --检查约束
check(Age>=18)
/*临时禁用已存在的约束*/
alter table People nocheck constraint CK_People_Age
/*查询约束*/
alter table People check constraint CK_People_Age
/*开启已禁用的约束*/
alter table People check constraint CK_People_Age