扫码下载APP
及时接收最新考试资讯及
备考信息
【摘 要】本文剖析了在编制和应用财务软件过程中数据表里出现冗余数据的原因及其引发的后果;在SQL Server 2000环境下,通过使用带参数的存储过程实现了对任意表中的冗余数据的删除操作;提出了构建隐含关键字避免数据冗余的方法,保证了实体完整性。
【关键词】冗余数据;SQL Server 2000;存储过程;关键字
1 引 言
企业中对财务软件的应用是企业信息化水平的重要标志,但在编制或应用财务软件的过程中,如对系统升级、数据表合并或跨年度数据整理时,都经常会产生重复数据的问题。而这部分冗余数据,从数据库设计角度看,不符合实体完整性规则;从财务管理的应用角度看,会导致错误的出现。
针对这种情况,在SQL Server 2000环境下,可以通过使用带参数的存储过程非常容易地实现对任意表中冗余记录的处理,并且在数据表设计中采用构建隐含关键字的方法避免冗余数据的产生。
2 冗余数据出现的原因及操作中的问题
2. 1冗余数据出现的原因分析
目前,财务软件中广泛使用的数据库是关系型数据库,其数据模型为关系模型。关系模型源于数学,它把所有的信息(数据)都存放在二维表中;每一个表又包含若干行与列,表被称为关系。关系的严格定义如下:
域是一组具有相同数据类型的值的集合;给定一组域Dl,D2,…,Dn,则Dl,D2,…,Dn的笛卡儿积为:Dl ×D2 ×…×Dn={(d1,d2,…,dn)|di∈Dj , j=1,2, …,n} (其中每一个元素(d1,d2,…,dn)被称为一个元组,元素中的每一个值di被称为一个分量);那么,Dl × D2 ×…× Dn的子集被称为在域Dl,D2,…,Dn上的关系,用R(Dl,D2,…,Dn)来表示。这里R表示关系的名字。
关系应具有的一个重要性质是关系中不允许重复的元组(即重复的记录),在关系中,保证数据的正确性和一致性是通过关系模型的完整性规则来约束关系的。完整性规则包括3类:实体完整性、参照完整性和用户定义的完整性。而实体完整性约束了在一个基本关系中各实体(即记录)是可区分的,具有唯一的标识。这是本文讨论的重点。
实体完整性要求每个基本关系中有且仅有一个不能为空值的主码(即关键字),每一个实体的主码值必须唯一。
从关系数据库的设计角度看,如果遵循实体完整性规则设计相应的关系,那么在数据表中是不会出现冗余数据的。数据表中出现冗余数据无外乎两种情况:
情况一:在数据表设计时并没有按照实体完整性规则建立数据表
在这种情况下,建立数据表时并没有为该表指定相应的关键字,如果多次为该数据表添加相同的记录后,就会出现冗余数据。
例:Create table jbbxx (kmbh char(10)qcje decimal(18,2),bqje decimal(18,2),rq datetime,czybh char(2))&建立数据表jbbxx
Insert into jbbxx values('10120101',30 000.56,
1 000.3,'07-03-02','01')&多次执行记录添加语句
情况二:在处理数据中,原表中的关键字约束的特性缺失
例:Create table jbbxx (kmbh char(12) not null primary key,qcje decimal(18,2),bqje decimal(18,2),rq datetime,czybh char(2))&建立带有关键字的原表jbbxx
Select * into jbbxx_bak from jbbxx where left(kmbh,4)='1012'&由原表生成新表jbbxx_bak
查看原表(见图1)和新表(见图2)的数据表结构,发现在由原表生成新表的过程中,原表所定义的kmbh关键字约束在形成新表后缺失了。
2. 2操作冗余数据出现的问题
经过上面的讨论,可知数据表中是会出现冗余数据的,并且一旦出现冗余数据,是无法通过交互方式进行修改、删除等操作的(见图3)。
究其原因,是因为交互状态下针对的是一条记录,而由于相同记录的存在,使数据库管理系统无法对当前记录进行定位。
3 处理冗余数据的实现方法
3. 1实现思路
对数据表中的冗余数据的处理,可以采用游标的方法遍历数据表中记录进行解决,但这种方法有些烦琐,本文介绍一种简单高效的方法使该问题得到很好的解决。该方法的关键是运用了SQL语言中Select查询语句的Distinct关键字,该关键字的使用能够在查询结果集中除去重复的行(即冗余数据),根据此思路可以形成一个没有冗余数据的结果表,步骤如下:
第一步:将有冗余数据存在的表中利用Distinct筛出不重复的记录放置到新表中;
第二步:将原表中记录删除;
第三步:将新表中的记录插入原表。
3. 2实现过程
本文用存储过程实现处理过程,存储过程是一组事先编译好的Transact-SQL代码,是一个独立的数据库对象,可以作为一个单元被用户的应用程序调用。
采用存储过程具有的优点是:(1)执行速度快。由于存储过程是已经编译好的代码,所以执行的时候不必再次进行编译,从而提高了程序的运行效率。(2)模块化编程。作为一个可重复使用的模块化单元,存储过程使得开发人员可以将复杂的功能封装起来,提供给用户简单的调用接口,不仅减少开发人员的工作量,也降低了应用的复杂度。
本文中,通过设计带参数的存储过程可以增强通用性,将数据表名设计为参数,可实现对任意表的冗余数据处理;另外,在删除记录时,因truncate语句比delete语句使用的系统和事务日志资源少,因此采用该语句提高效率。
Create procedure Clear_redundancy (@dbname nvarchar(25))
As
Declare @str nvarchar(255)
if Exists(select * from sysobjects where name=N'aa' And Xtype='U')
drop table aa
Set @str='select distinct * into aa from'+@dbname
EXEC sp_executesql @str &将无重复数据放入新表aa
Set @str=' truncate table '+@dbname
EXEC sp_executesql @str &采用truncate快速删除记录
Set @str='insert into'+@dbname+'select * fromaa'
EXEC sp_executesql @str&将aa中的记录插回到原表
Return
4 避免冗余数据产生的方法
虽然采用本文提供的方法可以清除冗余数据,但更有效的做法是避免冗余数据的出现,从而从根本上解决因数据冗余造成的在操作记录时的出错现象。
通过前面的分析,可以得知,数据冗余的产生或是由于设计数据表时未能通过关键字实现实体完整性的约束,或是指定了关键字,但在表的合并或相关操作中缺失了这一特性,因此,本文提出一种在设计表时定义隐含关键字方法,使这一问题很好地得到解决。
在SQL Server 2000中提供了在设计表时,通过标识列属性identity可以为该列提供一个唯一的、递增的值。该机制需要同时指定种子和增量,若不指定默认值(1,1),则此值在进行数据插入和修改时都无须用户指定该值,而由数据库系统管理和维护。因此,该列具有关键字的特性,即值唯一;而且在数据表的操作中又可保持列的identity属性。
Create table jbbxx (key_code int identity(1,1),kmbh char(10),qcje decimal(18,2),bqje decimal(18,2),rq datetime,czybh char(2))
其中,表jbbxx中的key_code列被定义为标识列,在添加记录时,其值单调增加,保持唯一性,从而保证了实体的完整性,因此,不会在操作(如修改、删除)中出现错误。
5 结 论
在实际工作中,数据冗余的存在会引起操作错误的出现,所以是每个数据库管理员需要解决的问题。本文从问题的产生原因进行分析,给出了一种简单高效的解决方法,并通过定义隐含关键字方法避免了该问题的出现,可以作为在实际数据库维护工作中的有效方法。
主要参考文献:
[1] 萨师煊,王珊. 数据库系统概论[M]. 第3版. 北京:高等教育出版社,2000:45-55.
[2] 许菱,秦晓海,孔令新. 巧用存储过程进行数据处理[J]. 中国管理信息化,2006,(7):62-64.
[3] 尹萍. SQL Server数据库性能优化[J]. 计算机应用与软件,2005,(3):51-53.
[4] 王振辉,吴广茂. SQL查询语句优化研究[J]. 计算机应用, 2005,(12):207-208.
[5] 金天荣. SQL Server的查询优化方法的设计和实现[J]. 微计算机信息,2006,(18):239-241.
Copyright © 2000 - www.chinaacc.com All Rights Reserved. 北京正保会计科技有限公司 版权所有
京B2-20200959 京ICP备20012371号-7 出版物经营许可证 京公网安备 11010802044457号