2014-11-02 131 views
1

對不起模糊的標題,我不確定如何定義我想要做的事情。如何刪除「子」記錄?

我有3個表: 類 - 具有唯一的ID(CAT_ID) 問題 - 都有一個唯一的ID和類別外鍵(ques_category_fk) 答案 - 有一個唯一的ID和問題外鍵(ans_question_fk)

我想要做的是刪除一個類別下的所有問題和答案。刪除問題不成問題。但是,我不確定如何使用相同的SQL語句刪除答案。

我想加載所有的問題,迭代他們或添加一個類別的外鍵的答案。這兩個看起來效率不高。

這是我目前的DELETE語句:

DELETE FROM questions WHERE ques_category_fk = @fk 
+1

查看http://stackoverflow.com/questions/1233451/delete-from-two-tables-in-one-query並適應您的三表情景。 – wolfgangwalther 2014-11-02 23:41:16

回答

1

更容易編寫和維護的解決方案將在一個事務中運行這些查詢,答案和問題的缺失,分開,然後提交。通過這種方式,您可以確定它們全部被刪除(如果查詢失敗,則全部刪除),並且您不必訴諸長時間和令人困惑的查詢。

把它放在一個模擬的例子中,讓我們說你想刪除一個問題,以及隨後的答案,id = 6(在我的例子中,idquestion是表格問題中的pkey,並且是f_key的名稱表的答案):

start transaction; 
delete from answers where idquestions = 6; 
delete from questions where idquestions = 6; 
commit; 

,然後如果你想刪除許多問題,首先運行一個查詢,選擇您要刪除,遍歷所有這些問題的標識 - 運行上面的設置每個ID查詢。

+0

對不起,我不清楚你在說什麼。你是說我應該使用我的想法重複回答問題並刪除每個問題的答案? – 2014-11-02 23:37:00

+0

非常多,但有一個但是。作爲一個交易,但是 - 運行每個刪除集合*的一個問題並作出答案)。這樣,如果出於某種原因,刪除答案或問題將會失敗,您將不會被弄得一團糟。 – 2014-11-02 23:38:44

+0

所以你說要加載所有問題,然後爲每個問題加載所有答案,然後一次刪除一個答案? – 2014-11-02 23:41:55

0

創建「子級」表以級聯刪除引用的「父」表。類似這樣的:

CREATE TABLE answers (
    id SERIAL, 
    question_id int REFERENCES questions(id) ON DELETE CASCADE, 
    ... 
); 

現在,刪除問題記錄也會刪除引用的答案記錄。

+0

我使用Visual Studios Express中的數據庫瀏覽器創建了這些表。可以通過數據庫瀏覽器設置它嗎? – 2014-11-03 00:51:15

+0

@LeeLoftiss這種引用很好,但不能很好地擴展(垂直或水平),並且希望應用程序的用戶基礎會增長,這將成爲一個主要問題。問問自己 - 這個潛在的定時炸彈值得懶惰發送一個查詢而不是兩個? – 2014-11-03 01:42:56

+0

咦?如果「子」記錄「屬於」「父」記錄,那麼爲什麼要將它作爲兩個操作來執行 - 這似乎更有可能是未來的錯誤,而不是記錄如何保持參照完整性。 – 2014-11-04 01:44:47