2013-03-12 76 views
2

我有一個表(稱爲表A),它具有活動列。此列可以是1或0.如果它是0,則表示它已被刪除。這是一個軟刪除。Oracle強制執行軟刪除約束

我遇到的問題是我想驗證該表中的行上的外鍵約束。如果我想從表A中刪除一行,那麼通常會由於與其他行的關係而通過外鍵約束來刪除。這是好的和預期的。我的問題是,因爲我的刪除軟(只更新一個標誌),我沒有得到任何約束檢查,當我刪除。這意味着我需要手動檢查關係。

是否有無論如何我可以添加一個約束到一個oracle表,它使用1和0作爲完整性約束的一部分?例如,如果我將活動列更新爲0,則它​​將遇到約束,因此不會允許將列更改爲0.

可以以某種方式執行此操作嗎?

希望這是有道理的。

感謝

+0

我不認爲你可以用外鍵約束來做到這一點。我認爲你最好的選擇將是一個觸發器。你想要一個例子嗎? – 2013-03-12 21:00:58

+0

如果您從表中刪除一行並收到錯誤,則會拋出異常。你如何更新你的國旗?在單獨的過程中還是在刪除過程中?沒有1和0是Integr的一部分。約束。您只能添加檢查約束,例如,您的標誌位於1或0的位置。如果這有意義,您也可以考慮觸發器來更新某些其他表中的某些值。請發佈樣本數據,表格,數據等... – Art 2013-03-12 21:01:47

+0

感謝您的意見。我正在考慮一個觸發器,但希望我能夠更簡單地做一些約束。謝謝您的幫助。我會用一個觸發器來代替... – RNJ 2013-03-12 21:10:21

回答

2

從建模的角度看,在這種情況下,我對上移動「軟刪除」行到另一臺(例如日誌表),並使用硬刪除APC的評論傾斜。

另一種選擇(未測試)是包括在參考約束軟刪除列,如:

CREATE TABLE dept (
    dept_id number, 
    alive number, 
    constraint alive_ck check (alive in (0,1)), 
    constraint dept_pk primary key (dept_id, alive), 
    constraint dept_uk unique (dept_id) 
); 

CREATE TABLE emp (
    emp_id number, 
    dept_id number, 
    alive number, 
    constraint emp_pk primary key (emp_id), 
    constraint emp_dept_fk 
    foreign key (dept_id, alive) 
    references dept (dept_id, alive) 
); 

注意,部門表過的dept_id獨一無二的,但也有一個約束過度(dept_id爲,alive)來允許emp的引用約束。

這意味着您的應用程序現在需要在軟刪除一個部門的同時更新所有的emp行,並且如果您沒有對其進行編碼,那麼該約束將有效地確保該部門不能被軟刪除,除非emps首先被刪除(或軟刪除 - 儘管你必須使約束延遲才能工作)。

+0

我傾向於upvote這個答案,因爲它在技術上是正確的 - 但ACP的評論似乎更有幫助。 – 2013-03-13 06:38:08

+0

謝謝。我開始認爲硬刪除可能會更好。但複合關鍵思想是一個很好的想法。這就是我之後的事情。謝謝 – RNJ 2013-03-14 10:33:49