2017-04-09 41 views
0

我有一個數據庫表,其中有幾個表用於其他幾個表中。因此,給定的表可能會有一個「StateID」列,其中包含表示字符串「NJ」的「列表值」表中的數字(主鍵)。所以表示「NJ」的主鍵(整數)可以用在幾個不同表中的不同列中。如何確定數據庫中是否仍然使用查找值

現在我想允許用戶刪除這個「列表值」條目,但只有當它沒有在任何地方使用。或者,我希望有一個可以在任何可能使用的主鍵值處更改此默認值的sproc,該默認值仍然存在。

有沒有很好的方法來做到這一點?或者當我顯示「NJ」時,爲了說明我的代碼中缺少關鍵值,是否會更好?如果「NJ」不再存在,它會顯示默認值?

+0

如果你有一個合適的外鍵約束,只要嘗試刪除數據庫就會引發一個錯誤,如果該行仍然被引用。 –

回答

2

首先,我不知道刪除值是否是一個好主意,因爲它們目前沒有被使用。新澤西州所有這些好人和事物都可能希望有機會在未來的數據中表現出來。

其次,最好的辦法是設計數據庫時使用外鍵約束,每次引用另一個表。那麼很容易:

delete from t 
    where t.value = 'NJ'; 

然後 - 除非你已覆蓋默認的行爲 - 而任何其他行指的是它不能刪除該行。這是外鍵約束力的一部分。

唉,如果你沒有約束,那麼數據庫不知道可能是指哪一行。如果你這樣做,你可以檢查所有可能的表格。但是,你可能會錯過一個,然後事情就不會那麼好。

因此,瞭解外鍵約束並在設計數據庫時使用它們。

另一種可能更安全的方法是在查找表中有一個isDeleted標誌。然後使用僅選擇未刪除的行的視圖。您可以查看典型查詢中是否缺少任何內容。

+0

我傾向於同意你的第一個陳述,這可能是我最終決定的(只是不讓他們刪除)。但是我認爲可能會出現這種情況,他們希望從下拉列表中刪除一個項目,從而在記錄加載並且下拉列表中不包含相應的查找值時導致問題。所以我想我會看看是否有相對簡單的選擇。 –

+0

@StarfleetSecurity。 。 。如果您只想從下拉列表中刪除值,請在該行上使用可見性標誌。 –

相關問題