所謂字典就是數據庫應用中被其他表(通常加以外鍵約束)引用的表,如客戶表引用客戶類型,那么客戶類型即為字典表。刪除字典數據要考慮是否已被其他數據引用,一般不允許做級聯刪除。
這個問題想必大家都碰到過,但各有各的?做法。本人與若干同事討論過,將各種做法總結一下。
- 物理刪除,即用delete SQL刪除。如果字典數據被引用,則會拋出違反外鍵約束的異常,將其封裝為可讀的信息提示給用戶。JDBC中的異常類為SQLException,如何判斷是違反外鍵約束的異常呢?有方法如下:
- 利用SQLException中的errorCode,這是數據庫特有的錯誤編碼。
- 利用SQLException中的SQLState,在JAVA API DOC中說明這個是SQL99或XOPEN 標準的編碼,而且可以用connection的meta data來判斷符合哪個標準。經過的試驗,說明這個meta data不太好用,但是SQLState還是較為統一的。
? | mysql5.0.21 | sqlserver2000 | oracle10 | postgresql8 |
ANSI99 SQLState標準的違反外鍵約束編碼為:23000 | 23000 | 23000 | 23000 | 23503(可能要在BatchUpdateException的nextException中才能取得) |
Connection的meta data中的getSQLStateType(),符合SQL99標準應該為2 | 2 | 2 | 0 | 2 |
- 邏輯刪除。即置表中的一個標記字段為已刪除。查詢時不可見,但實際還保留在表中。 好處是不用處理數據被引用的情況。它的缺點是,如果數據沒有被引用,那么它其實可以被物理刪除,但確留在系統中成為垃圾數據;其次在數據有唯一編碼的情況下,被邏輯刪除的數據實際上還占用著一個編碼,有時用戶會疑惑,明明表中查不到這個編碼,我在新增的數據中使用這個編碼卻總提示編碼已存在。
??? 各位又是用的什么方法來處理的呢?你的方法有何優缺點,不妨一同討論一下。
??