掃碼下載APP
及時接收最新考試資訊及
備考信息
【摘 要】本文剖析了在編制和應(yīng)用財務(wù)軟件過程中數(shù)據(jù)表里出現(xiàn)冗余數(shù)據(jù)的原因及其引發(fā)的后果;在SQL Server 2000環(huán)境下,通過使用帶參數(shù)的存儲過程實現(xiàn)了對任意表中的冗余數(shù)據(jù)的刪除操作;提出了構(gòu)建隱含關(guān)鍵字避免數(shù)據(jù)冗余的方法,保證了實體完整性。
【關(guān)鍵詞】冗余數(shù)據(jù);SQL Server 2000;存儲過程;關(guān)鍵字
1 引 言
企業(yè)中對財務(wù)軟件的應(yīng)用是企業(yè)信息化水平的重要標志,但在編制或應(yīng)用財務(wù)軟件的過程中,如對系統(tǒng)升級、數(shù)據(jù)表合并或跨年度數(shù)據(jù)整理時,都經(jīng)常會產(chǎn)生重復數(shù)據(jù)的問題。而這部分冗余數(shù)據(jù),從數(shù)據(jù)庫設(shè)計角度看,不符合實體完整性規(guī)則;從財務(wù)管理的應(yīng)用角度看,會導致錯誤的出現(xiàn)。
針對這種情況,在SQL Server 2000環(huán)境下,可以通過使用帶參數(shù)的存儲過程非常容易地實現(xiàn)對任意表中冗余記錄的處理,并且在數(shù)據(jù)表設(shè)計中采用構(gòu)建隱含關(guān)鍵字的方法避免冗余數(shù)據(jù)的產(chǎn)生。
2 冗余數(shù)據(jù)出現(xiàn)的原因及操作中的問題
2. 1冗余數(shù)據(jù)出現(xiàn)的原因分析
目前,財務(wù)軟件中廣泛使用的數(shù)據(jù)庫是關(guān)系型數(shù)據(jù)庫,其數(shù)據(jù)模型為關(guān)系模型。關(guān)系模型源于數(shù)學,它把所有的信息(數(shù)據(jù))都存放在二維表中;每一個表又包含若干行與列,表被稱為關(guān)系。關(guān)系的嚴格定義如下:
域是一組具有相同數(shù)據(jù)類型的值的集合;給定一組域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上的關(guān)系,用R(Dl,D2,…,Dn)來表示。這里R表示關(guān)系的名字。
關(guān)系應(yīng)具有的一個重要性質(zhì)是關(guān)系中不允許重復的元組(即重復的記錄),在關(guān)系中,保證數(shù)據(jù)的正確性和一致性是通過關(guān)系模型的完整性規(guī)則來約束關(guān)系的。完整性規(guī)則包括3類:實體完整性、參照完整性和用戶定義的完整性。而實體完整性約束了在一個基本關(guān)系中各實體(即記錄)是可區(qū)分的,具有唯一的標識。這是本文討論的重點。
實體完整性要求每個基本關(guān)系中有且僅有一個不能為空值的主碼(即關(guān)鍵字),每一個實體的主碼值必須唯一。
從關(guān)系數(shù)據(jù)庫的設(shè)計角度看,如果遵循實體完整性規(guī)則設(shè)計相應(yīng)的關(guān)系,那么在數(shù)據(jù)表中是不會出現(xiàn)冗余數(shù)據(jù)的。數(shù)據(jù)表中出現(xiàn)冗余數(shù)據(jù)無外乎兩種情況:
情況一:在數(shù)據(jù)表設(shè)計時并沒有按照實體完整性規(guī)則建立數(shù)據(jù)表
在這種情況下,建立數(shù)據(jù)表時并沒有為該表指定相應(yīng)的關(guān)鍵字,如果多次為該數(shù)據(jù)表添加相同的記錄后,就會出現(xiàn)冗余數(shù)據(jù)。
例:Create table jbbxx (kmbh char(10)qcje decimal(18,2),bqje decimal(18,2),rq datetime,czybh char(2))&建立數(shù)據(jù)表jbbxx
Insert into jbbxx values('10120101',30 000.56,
1 000.3,'07-03-02','01')&多次執(zhí)行記錄添加語句
情況二:在處理數(shù)據(jù)中,原表中的關(guān)鍵字約束的特性缺失
例:Create table jbbxx (kmbh char(12) not null primary key,qcje decimal(18,2),bqje decimal(18,2),rq datetime,czybh char(2))&建立帶有關(guān)鍵字的原表jbbxx
Select * into jbbxx_bak from jbbxx where left(kmbh,4)='1012'&由原表生成新表jbbxx_bak
查看原表(見圖1)和新表(見圖2)的數(shù)據(jù)表結(jié)構(gòu),發(fā)現(xiàn)在由原表生成新表的過程中,原表所定義的kmbh關(guān)鍵字約束在形成新表后缺失了。
2. 2操作冗余數(shù)據(jù)出現(xiàn)的問題
經(jīng)過上面的討論,可知數(shù)據(jù)表中是會出現(xiàn)冗余數(shù)據(jù)的,并且一旦出現(xiàn)冗余數(shù)據(jù),是無法通過交互方式進行修改、刪除等操作的(見圖3)。
究其原因,是因為交互狀態(tài)下針對的是一條記錄,而由于相同記錄的存在,使數(shù)據(jù)庫管理系統(tǒng)無法對當前記錄進行定位。
3 處理冗余數(shù)據(jù)的實現(xiàn)方法
3. 1實現(xiàn)思路
對數(shù)據(jù)表中的冗余數(shù)據(jù)的處理,可以采用游標的方法遍歷數(shù)據(jù)表中記錄進行解決,但這種方法有些煩瑣,本文介紹一種簡單高效的方法使該問題得到很好的解決。該方法的關(guān)鍵是運用了SQL語言中Select查詢語句的Distinct關(guān)鍵字,該關(guān)鍵字的使用能夠在查詢結(jié)果集中除去重復的行(即冗余數(shù)據(jù)),根據(jù)此思路可以形成一個沒有冗余數(shù)據(jù)的結(jié)果表,步驟如下:
第一步:將有冗余數(shù)據(jù)存在的表中利用Distinct篩出不重復的記錄放置到新表中;
第二步:將原表中記錄刪除;
第三步:將新表中的記錄插入原表。
3. 2實現(xiàn)過程
本文用存儲過程實現(xiàn)處理過程,存儲過程是一組事先編譯好的Transact-SQL代碼,是一個獨立的數(shù)據(jù)庫對象,可以作為一個單元被用戶的應(yīng)用程序調(diào)用。
采用存儲過程具有的優(yōu)點是:(1)執(zhí)行速度快。由于存儲過程是已經(jīng)編譯好的代碼,所以執(zhí)行的時候不必再次進行編譯,從而提高了程序的運行效率。(2)模塊化編程。作為一個可重復使用的模塊化單元,存儲過程使得開發(fā)人員可以將復雜的功能封裝起來,提供給用戶簡單的調(diào)用接口,不僅減少開發(fā)人員的工作量,也降低了應(yīng)用的復雜度。
本文中,通過設(shè)計帶參數(shù)的存儲過程可以增強通用性,將數(shù)據(jù)表名設(shè)計為參數(shù),可實現(xiàn)對任意表的冗余數(shù)據(jù)處理;另外,在刪除記錄時,因truncate語句比delete語句使用的系統(tǒng)和事務(wù)日志資源少,因此采用該語句提高效率。
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 &將無重復數(shù)據(jù)放入新表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 避免冗余數(shù)據(jù)產(chǎn)生的方法
雖然采用本文提供的方法可以清除冗余數(shù)據(jù),但更有效的做法是避免冗余數(shù)據(jù)的出現(xiàn),從而從根本上解決因數(shù)據(jù)冗余造成的在操作記錄時的出錯現(xiàn)象。
通過前面的分析,可以得知,數(shù)據(jù)冗余的產(chǎn)生或是由于設(shè)計數(shù)據(jù)表時未能通過關(guān)鍵字實現(xiàn)實體完整性的約束,或是指定了關(guān)鍵字,但在表的合并或相關(guān)操作中缺失了這一特性,因此,本文提出一種在設(shè)計表時定義隱含關(guān)鍵字方法,使這一問題很好地得到解決。
在SQL Server 2000中提供了在設(shè)計表時,通過標識列屬性identity可以為該列提供一個唯一的、遞增的值。該機制需要同時指定種子和增量,若不指定默認值(1,1),則此值在進行數(shù)據(jù)插入和修改時都無須用戶指定該值,而由數(shù)據(jù)庫系統(tǒng)管理和維護。因此,該列具有關(guān)鍵字的特性,即值唯一;而且在數(shù)據(jù)表的操作中又可保持列的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列被定義為標識列,在添加記錄時,其值單調(diào)增加,保持唯一性,從而保證了實體的完整性,因此,不會在操作(如修改、刪除)中出現(xiàn)錯誤。
5 結(jié) 論
在實際工作中,數(shù)據(jù)冗余的存在會引起操作錯誤的出現(xiàn),所以是每個數(shù)據(jù)庫管理員需要解決的問題。本文從問題的產(chǎn)生原因進行分析,給出了一種簡單高效的解決方法,并通過定義隱含關(guān)鍵字方法避免了該問題的出現(xiàn),可以作為在實際數(shù)據(jù)庫維護工作中的有效方法。
主要參考文獻:
?。?] 薩師煊,王珊. 數(shù)據(jù)庫系統(tǒng)概論[M]. 第3版. 北京:高等教育出版社,2000:45-55.
[2] 許菱,秦曉海,孔令新. 巧用存儲過程進行數(shù)據(jù)處理[J]. 中國管理信息化,2006,(7):62-64.
?。?] 尹萍. SQL Server數(shù)據(jù)庫性能優(yōu)化[J]. 計算機應(yīng)用與軟件,2005,(3):51-53.
?。?] 王振輝,吳廣茂. SQL查詢語句優(yōu)化研究[J]. 計算機應(yīng)用, 2005,(12):207-208.
[5] 金天榮. SQL Server的查詢優(yōu)化方法的設(shè)計和實現(xiàn)[J]. 微計算機信息,2006,(18):239-241.
安卓版本:8.7.20 蘋果版本:8.7.20
開發(fā)者:北京正保會計科技有限公司
應(yīng)用涉及權(quán)限:查看權(quán)限>
APP隱私政策:查看政策>
HD版本上線:點擊下載>
官方公眾號
微信掃一掃
官方視頻號
微信掃一掃
官方抖音號
抖音掃一掃
Copyright © 2000 - m.yinshua168.com.cn All Rights Reserved. 北京正保會計科技有限公司 版權(quán)所有
京B2-20200959 京ICP備20012371號-7 出版物經(jīng)營許可證 京公網(wǎng)安備 11010802044457號