黑子的程序員生涯

          努力保持編程中美好的感覺

          如何刪除字典數(shù)據(jù)?

          所謂字典就是數(shù)據(jù)庫應(yīng)用中被其他表(通常加以外鍵約束)引用的表,如客戶表引用客戶類型,那么客戶類型即為字典表。刪除字典數(shù)據(jù)要考慮是否已被其他數(shù)據(jù)引用,一般不允許做級(jí)聯(lián)刪除。

          這個(gè)問題想必大家都碰到過,但各有各的?做法。本人與若干同事討論過,將各種做法總結(jié)一下。

          1. 物理刪除,即用delete SQL刪除。如果字典數(shù)據(jù)被引用,則會(huì)拋出違反外鍵約束的異常,將其封裝為可讀的信息提示給用戶。JDBC中的異常類為SQLException,如何判斷是違反外鍵約束的異常呢?有方法如下:
            • 利用SQLException中的errorCode,這是數(shù)據(jù)庫特有的錯(cuò)誤編碼。
            • 利用SQLException中的SQLState,在JAVA API DOC中說明這個(gè)是SQL99或XOPEN 標(biāo)準(zhǔn)的編碼,而且可以用connection的meta data來判斷符合哪個(gè)標(biāo)準(zhǔn)。經(jīng)過的試驗(yàn),說明這個(gè)meta data不太好用,但是SQLState還是較為統(tǒng)一的。
              ?mysql5.0.21sqlserver2000oracle10postgresql8
              ANSI99 SQLState標(biāo)準(zhǔn)的違反外鍵約束編碼為:2300023000230002300023503(可能要在BatchUpdateException的nextException中才能取得)
              Connection的meta data中的getSQLStateType(),符合SQL99標(biāo)準(zhǔn)應(yīng)該為22202
          2. 邏輯刪除。即置表中的一個(gè)標(biāo)記字段為已刪除。查詢時(shí)不可見,但實(shí)際還保留在表中。 好處是不用處理數(shù)據(jù)被引用的情況。它的缺點(diǎn)是,如果數(shù)據(jù)沒有被引用,那么它其實(shí)可以被物理刪除,但確留在系統(tǒng)中成為垃圾數(shù)據(jù);其次在數(shù)據(jù)有唯一編碼的情況下,被邏輯刪除的數(shù)據(jù)實(shí)際上還占用著一個(gè)編碼,有時(shí)用戶會(huì)疑惑,明明表中查不到這個(gè)編碼,我在新增的數(shù)據(jù)中使用這個(gè)編碼卻總提示編碼已存在。

          ??? 各位又是用的什么方法來處理的呢?你的方法有何優(yōu)缺點(diǎn),不妨一同討論一下。

          ??

          posted on 2006-09-01 15:20 黑子 閱讀(804) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 屯留县| 读书| 溧水县| 阳泉市| 呼图壁县| 泌阳县| 吐鲁番市| 屯昌县| 镇安县| 克山县| 荣成市| 郑州市| 津市市| 远安县| 古丈县| 鄄城县| 义马市| 安徽省| 连江县| 鹤岗市| 九龙城区| 剑阁县| 南城县| 西城区| 象州县| 桐城市| 邯郸市| 乡城县| 南通市| 五峰| 烟台市| 神木县| 调兵山市| 古丈县| 镇原县| 山西省| 西乌珠穆沁旗| 兴隆县| 永春县| 盱眙县| 石台县|