如何刪除字典數(shù)據(jù)?
所謂字典就是數(shù)據(jù)庫應(yīng)用中被其他表(通常加以外鍵約束)引用的表,如客戶表引用客戶類型,那么客戶類型即為字典表。刪除字典數(shù)據(jù)要考慮是否已被其他數(shù)據(jù)引用,一般不允許做級(jí)聯(lián)刪除。
這個(gè)問題想必大家都碰到過,但各有各的?做法。本人與若干同事討論過,將各種做法總結(jié)一下。
- 物理刪除,即用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.21 sqlserver2000 oracle10 postgresql8 ANSI99 SQLState標(biāo)準(zhǔn)的違反外鍵約束編碼為:23000 23000 23000 23000 23503(可能要在BatchUpdateException的nextException中才能取得) Connection的meta data中的getSQLStateType(),符合SQL99標(biāo)準(zhǔn)應(yīng)該為2 2 2 0 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) 編輯 收藏