数据库完整性(Database Integrity)是指数据库中数据的正确性和相容性,其目的是防止垃圾数据的进出。数据库完整性由各种各样的完整性约束来保证,因此可以说数据库完整性设计就是数据库完整性约束的设计。加在数据库之上的语义约束条件就是数据库完整性约束条件。
完整性约束条件作用对象可以使关系、元组、列三种。
● 列约束主要是列的数据类型、取值范围、精度、排序等约束条件。
● 元组的约束是元组中各个字段间的联系的约束。
● 关系的约束是若干元组间、关系集合上以及关系之间的联系的约束。
完整性约束条件涉及这三类对象,其状态可以是静态的,也可以是动态的。所谓静态约束是指数据库每一确定状态时的数据对象所应满足的约束条件。它是反映数据库状态合理性的约束,这是最重要的一类完整性约束。
动态约束是指数据库从一种状态转变为另一种状态时,新、旧值之间所应满足的约束条件。
完整性约束条件可分为以下六类:
● 静态列级约束
● 静态元组约束
● 静态关系约束
● 动态列级约束
● 动态元组约束
● 动态关系约束
1 静态列级约束是对一个列的取值域的说明,包括以下几个方面:
(1) 对数据类型的约束,包括数据的类型、长度、单位、精度等;
(2) 对数据格式的约束。例如规定日期的格式为YYYY-MM-DD;
(3) 对取值范围或取值集合的约束。例如规定学生的成绩取值范围为0~100;
(4) 对空值的约束,规定哪些列可以为空值,哪些列不能为空值;
2 静态元组约束就是规定元组的各个列之间的约束关系。例如,订货关系中包含发货量、订货量等列,规定发货量不得超过订货量。
3 静态关系约束是指在一个关系的各个元组之间或者若干关系之间存在的约束。常见的静态约束有:
(1) 实体完整性约束;
(2) 引用完整性约束;
(3) 函数依赖约束;大部分函数依赖约束都在关系模式中定义。
(4) 统计约束;即字段值与关系中多个元组的统计值之间的约束关系。例如,规定部门经理的工资不得高于本部门职工平均工资的5倍,不得低于本部门职工平均工资的2倍。
4 动态列级约束是修改列定义或列值时应满足的约束条件,包括下面两方面:
(1) 修改列定义时的约束。例如,将允许空值的列改为不允许空值时,如果该列目前已存在空值,则拒绝这种修改。
(2) 修改列值时的约束。修改列值时有时需要参照其旧值,并且新旧值之间需要满足某种约束条件。例如,职工调整后的工资不得低于其调整前的原来工资;职工婚姻状态的变化只能是由未婚到已婚、已婚到离异、离异到再婚等几种情况。
5 动态元组约束是指修改元组的值时元组中各个字段间需要满足某种约束条件。例如,职工工资调整时新工资不得低于原工资+工龄15等。
6 动态关系约束是加在关系变化前后状态上的限制条件。例如,在集成电路芯片设计数据库中,一个设计中用到的所有单元的工艺必相同,因此,在更新某个设计单元时,设计单元的新老工艺必须保持一致。
关系的完整性主要包括域完整性、实体完整性和参照完整性三种。
1.域完整性
域完整性是对数据表中字段属性的约束,它包括字段的值域、字段的类型及字段的有效规则等约束,它是由确定关系结构时所定义的字段的属性决定的。
2.实体完整性
实体完整性是对关系中的记录唯一性,也就是主键的约束。准确地说,实体完整性是指关系中的主属性值不能为Null且不能有相同值。
3.参照完整性
参照完整性是对关系数据库中建立关联关系的数据表间数据参照引用的约束,也就是对外键的约束。准确地说,参照完整性是指关系中的外键必须是另一个关系的主键有效值,或者是NULL。
数据库约束是为了保证数据的完整性而实现的一套机制,它具体的根据各个不同的数据库的实现而有不同的工具。
一般来说有以下几种实现方式:
1、检查约束:
通过在定义数据库表里,在字段级或者是在表级加入的检查约束,使其满足特定的要求。
比如以下的表定义:
CRATE TABLE student(
id serial,
name varchar(10),
scrore integer CHECK (scrore > 0));
定义分数不能小于0。
也可以在表级定义:
CHECK (字段1 秘字段2之间的关系)
2、非空约束:
这个大家应该很熟悉了。直接在字段后面加上:NOT NULL。
3、唯一约束:
定义一个唯一约束但是它并不包括NULL值。直接在字段定义后加入UNIQUE即可定义一个唯一约束。
4、主键约束:
SQL 92建议在建立一个表时定义一个主键:它其实就是:唯一约束+非空约束。
5、外键:
所有约束里数这个约束最有意思了:比如说有这样一件事,你需要做一个学生查询的网页。那么为了方便,你将建立三个数据表:
一个是学生情况表:
CREATE TABLE student(
id serial primary ke,
name varchar(10),
);
一个表是记录所开的课程
CREATE TABLE class(
class_id varchar(5) primary key,
describe varchar(20)
);
一个表是记录学生成绩的表:
CREATE TABLE score(
id integer references student,
class_id varchar(5) references class,
score integer CHECK (score > 0)
);
这个时候你会发现以下几件事:
如果你在成绩表里输入不存在的学生和课程,数据系统将拒绝。如果你要删除一个学生,但是他已经在成绩表里有记录,数据库将拒绝删除这个学生的记录。
那么我们现在来看,前面一个对我们是有利的,因为谁都不想一个学生无缘无故的有了一个成绩的记录,但是在删除的时候就会比较麻烦了,有时候我的确是想删除这个学生。那么我总不能在应用程序里照顾得那么周到吧。不要紧我们在定义数据表的时候只在外键那一样加入以下控制就OK了,我们来重新定义数据表 score
CREATE TABLE score(
id integer references student ON UPDATE CASCADE ON DELETE CASCADE, //我们希望在学生记录改变时自动改变分数记录,在删除学生级联删除分数记录
class_id varchar(5) references class ON UPDATE CASCADE ON DELETE
RESTRICT, //我们希望在改变课程时自动改变分数记录表里关于课程的引用,但是不希望删除课程时级联删除分数。
);
这样我们就可以很好做到数据完整了。
数据库中删除约束的方法:
1、sql
server中删除约束的语句是:
alter
table
表名
drop
constraint
约束名
sp_helpconstraint
表名
找到数据表中的所有列的约束
2、oracle中删除约束的语句:
先找到表的约束名称,执行:
select
from
user_constraints;
其中
CONSTRAINT_NAME
为表的约束名称
然后删除约束:
alter
table
表名
drop
constraint
约束名
cascade;
3、mysql中删除约束的语句是:
1)删除主键约束:
alter
table
表名
drop
primary
key;
2)删除外键约束:alter
table
表名
drop
foreign
key
外键(区分大小写);
1 建表时加上唯一性约束
CREATE TABLE `t_user` (
`Id` int(11) NOT NULL AUTO_INCREMENT, -- 自增
`username` varchar(18) NOT NULL unique, -- 唯一性约束
`password` varchar(18) NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=1018 DEFAULT CHARSET=gbk;
2给已经建好的表加上唯一性约束
ALTER TABLE `t_user` ADD unique(`username`);
参考资料
csdncsdn[引用时间2018-1-9]
数据库中的外码约束指用于在两个表之间建立关系,需要指定引用主表的哪一列。对于存在外码约束的表,如果进行删除非空的外码,可能会出现错误。如果在外码约束的列中输入非 NULL 值,则此值必须在被引用的列中存在,否则将返回违反外码约束的错误信息。
扩展资料:
外码约束仅能引用位于同一服务器上的同一数据库中的表。数据库间的引用完整性必须通过触发器实现。一个表最多可包含 253 个外码约束。对于临时表不强制 外码约束。
有外码约束可以引用同一表中的其它列(自引用)。列级外码约束的 REFERENCES 子句仅能列出一个引用列,且该列必须与定义约束的列具有相同的数据类型。
表级外码约束的 REFERENCES 子句中引用列的数目必须与约束列列表中的列数相同。每个引用列的数据类型也必须与列表中相应列的数据类型相同。
1、外键的概念:外键是关系数据库三个完整性的五个约束条件之一,是表与表之间建立的一种关系。在Oracle数据库的scott/tiger用户中,表Dept和Emp通过外键进行了关联。在这里Dept表叫主表,Emp表叫从表,外键是字段Deptno。
2、加入外键的条件:a、两个表有相同属性字段,取值范围相同;
b、外键在主表中是主键或者是唯一字段;
c、外键可以是多个字段的组合。
记住一句话:从表的外键是主表的主键或唯一字段。
以上就是关于什么是数据库的完整性约束条件全部的内容,包括:什么是数据库的完整性约束条件、关系数据库中,关系的完整性约束包括哪几种,它们分别有什么作用、数据库设置约束条件有什么好处等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)