数据库中三个完整性规则(关系完整性的三种类型)
优炫数据库(UXDB)的数据完整性包括传输完整性、存储数据完整性和实体、参照、用户定义完整性。
用户定义基本表时数据库中三个完整性规则,说明主键、外键数据库中三个完整性规则,被引用表、列和引用行为。当数据录入、更新、删除时,由数据库管理系统根据说明自动维护实体完整性和参照完整性。
系统提供定义和检查用户定义完整性规则的机制,其目的是用统一的方式由系统处理,而不是由应用程序完成,从而不仅可以简化应用程序,还提高了完整性保证的可靠性。
传输完整性
传输完整性,即在不同的终端用相同的用户登录相同的数据库,进行不同的操作,所有操作结果都会正确的传输到数据库中。
1)在终端1中创建一张表test
create table test (id int,info varchar(20));
2)在第2个终端,对表test进行查询并增加一条记录
insert into test values(1,'test');
3)第3个终端进行查询操作,验证数据是否存在
select * from test;
可以查看到数据存在
4)在第1个终端进行update操作
update test set info ='test1' where id=1;
5)第3个终端进行查询操作,验证数据是否修改成功
select * from test;
可以看到数据修改成功
6)在第1个终端进行delete操作
delete from test where id=1;
7)第3个终端进行查询操作,验证数据是否删除成功
select * from test;
可以看到数据删除成功
存储完整性
存储完整性,是为了防止存储的数据文件被篡改,一旦修改存储数据文件中的元数据,那么该数据块就会报错,无法访问。
1)创建非加密集群并启动
initdb -I -k -W -D /home/uxdb/uxdbinstall/test02
ux_ctl -I -o "-I" -D /home/uxdb/uxdbinstall/test02 start
2)登录数据库创建测试表并插入数据写入磁盘
create table test(a int,b char(10));
insert into test values (111,'aaaaa');
insert into test values (222,'bbbbb');
insert into test values (333,'ccccc');
insert into test values (444,'ddddd');
select * from test;
checkpoint;
3)确定数据在集群中的存储位置
select ux_relation_filepath('test');
4)退出控制台并进入集群目录修改存储数据文件,例如将元组信息’aaaaa’改为’aaaab’
vi base/13245/16384
5)重启集群
6)登录数据库查询表
select * from test;
7)恢复修改的元组信息(’aaaab’恢复为’aaaaa’),并重启数据库
8)登录数据库查询表
select * from test;
实体完整性
1) 创建测试表并插入数据
create table student(sno integer primary key,sname char(10));
insert into student values(1,'张三');
insert into student values(2,'李四');
insert into student values(3,'王五');
2) 插入主键重复的数据
insert into student values(2,'赵六');
3) 插入主键为空的数据
insert into student(sname) values('钱七');
参照完整性
1) 创建外键测试表并插入数据
create table a (id int primary key,coll varchar(4));
create table b (id_ref int ,coll varchar(4));
alter table b add constraint FK_ID foreign key(id_ref) references a(id);
insert into a values (1,'ac');
insert into b values (1,'ac');
2) 插入违反外键约束的数据
insert into b values (2,'ac');
用户定义完整性
1)创建测试表
create type enum_sex as enum('M','F');
create table student (id int unique,name varchar(20)not null,class int default '150101',sex enum_sex );
2)唯一性约束验证
insert into student values(1,'赵小红',150334,'M');
insert into student values(1,'张小美',150323,'M');
3)验证默认值约束
insert into student (id,name,sex) values(3,'赵文虎','F');
select *from student where id=3;
4)验证非空约束
insert into student(id,name,class,sex)values(3,null,20150609,'M');
5)验证自定义约束,执行以下SQL语句
insert into student values(6,'张小虎',20150621,'N');
6)验证触发器约束
创建测试表和触发器:
create table test_check(id varchar(20),age int);
create or replace function pro_test_check() returns trigger as
$$
begin
if new.age>=120 then
raise notice 'check fail';
return null;
else
raise notice 'check success';
return new;
end if;
end;
$$ language pluxsql;
创建触发器:
create trigger testcheck before insert on test_check for each row execute procedure pro_test_check();
插入数据测试
insert into test_check values('1200',39);
insert into test_check values('1201',120);
select * from test_check ;
第一条插入插入成功。第二条插入失败,数据未插入表中。