2015-06-01 62 views
2

我創建了兩個表,如marksusers。我維護兩個表之間的外鍵關係,當我刪除marks表中的一行時,我需要根據uid刪除用戶表中的那個特定用戶,這兩個表中都存在這兩個表。最好的方法來刪除兩個表中有外鍵記錄?

+0

我試着像在一個用戶表中列與sid,名稱,pwd,uid(PK)類似,在標記表名稱中的所有主題標記和uid(FK)。如果我試圖刪除基於該uid的標記中的行,我可以刪除用戶表中的記錄? –

+1

[如何使用級聯刪除與SQL Server?](http://stackoverflow.com/questions/6260688/how-do-i-use-cascade-delete-with-sql-server) – har07

+0

可能重複的[使用觸發器來實現參照完整性操作(SQL Server)](http://stackoverflow.com/questions/30086504/using-triggers-to-implement-referential-integrity-actions-sql-server) –

回答

3

如果您希望在父表中刪除相應的行時刪除子表中的行,請使用ON DELETE CASCADE選項。

但是您的情況與此相反。無法自動執行反向 。

您需要明確地使用刪除觸發器,只要記錄從子表中刪除 。

BTW它不是安全地做反向,因爲可能是單個用戶的許多痕跡記錄,如果刪除它們中的任何一個用戶,然後從用戶表中刪除。

我建議在sproc中按邏輯操作。

你可以檢查存儲在用戶表中刪除用戶的所有用戶記錄在標記表中刪除。

2

那麼對於你的情況,我會建議使用on delete cascade

更多一點:
與級聯外鍵刪除意味着如果在父表中的記錄被刪除,然後在子表中的相應記錄會自動被刪除。這在SQL Server中稱爲級聯刪除。

創建具有級聯外鍵刪除使用CREATE在SQL Server(的Transact-SQL)TABLE語句的語法是:

CREATE TABLE child_table 
(
    column1 datatype [ NULL | NOT NULL ], 
    column2 datatype [ NULL | NOT NULL ], 
    ... 

    CONSTRAINT fk_name 
    FOREIGN KEY (child_col1, child_col2, ... child_col_n) 
    REFERENCES parent_table (parent_col1, parent_col2, ... parent_col_n) 
    ON DELETE CASCADE 
    [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
); 

更多閱讀this

+0

不,你不能做那 –

+0

如果我想從asp.net刪除記錄,我如何在sql命令中實現? –

+0

就刪除而言,你可以肯定,但你必須小心,例如,你用uid 1刪除子記錄,然後用uid 1從父表記錄中刪除,可以有更多的子記錄具有uid 1,在這種情況下,它不會允許刪除 –

0

在設計中只使用在刪除級聯

CREATE TABLE child_table 
(
    column1 datatype [ NULL | NOT NULL ], 
    column2 datatype [ NULL | NOT NULL ], 
    ... 

    CONSTRAINT fk_name 
    FOREIGN KEY (child_col1, child_col2, ... child_col_n) 
    REFERENCES parent_table (parent_col1, parent_col2, ... parent_col_n) 
    ON DELETE CASCADE 
    [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
); 

現在當你刪除父。孩子會自動刪除...你不需要做任何事情

檢查鏈接查看詳細 On delete cascade

0

因爲我不喜歡從相關表DELETE任何行,我建議你這個解決方案:

  • 添加status場與您桌的1默認值。
  • 創建一個VIEW,該列表僅顯示status <> 0的行,並使用此VIEW顯示有效數據。

    對於父母子女或相關表,只顯示status <> 0的父行和子女表,如parent.status * child.status <> 0

  • [可選&額外] *創建log表或爲您的數據庫或表或只是你的重要的表一個journal和儲存像CreateEdit\ModifyDeleteUndelete等一些行動。
有了這個解決方案,您可以:

  • 支持UndoRedo
  • 支持Undelete操作!
  • 不要擔心沒有父母的孩子。
  • *發現舊數據,數據變化和許多其他信息。

還有很多其他的好處,你只是存儲更多的數據,它不關心一個良好的RDBMS。

我使用DELETE只是一個表,它是在最後的孩子點,其數據並不那麼重要。

相關問題