2010-08-29 130 views
1

我有一個名爲'pages'的表。每個頁面都有文本,視頻或圖像的內容類型。根據內容類型的不同,記錄也會插入文本,視頻或圖像表中。如果從主表中刪除行,則從其他表中刪除行

當我從'網頁'中刪除一行時,如何確保刪除另一個表中的行?我對CASCADE有一點了解,但我沒有使用外鍵。至少不明確。

我的表類似於下(我已經剝離出來是沒有相關的問題域)

頁:ID,標題,內容

視頻:PID(頁ID),youtube_url

任何幫助將不勝感激。

回答

7

,如果你的表是InnoDB的引擎,你可以聲明外鍵 + 上刪除級聯

例如:

CREATE TABLE parent (id INT NOT NULL, 
        PRIMARY KEY (id) 
) ENGINE=INNODB; 
CREATE TABLE child (id INT, parent_id INT, 
        INDEX par_ind (parent_id), 
        FOREIGN KEY (parent_id) REFERENCES parent(id) 
         ON DELETE CASCADE 
) ENGINE=INNODB; 

更多: http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

另一種方式宣佈觸發器 - 刪除前

手冊:

http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

一個小例子,你可以找到:

Trigger before delete MySql

+0

我不使用InnoDB的沒有。我可以看到解決這個問題的唯一方法是,從父項中刪除一行,檢查內容類型並從子表中刪除該行。 雖然我確定有更好的解決方案。 – 2010-08-29 15:30:18

+0

你可以聲明觸發器,是我寫的 – 2010-08-29 15:31:23

+0

+1的2個選項 - 在數據庫級別,這些是2個選項。但是,如果可能的話,我會建議使用事務在應用程序級別執行此操作。級聯刪除和數據庫觸發器都可能成爲維護噩夢,因爲它們在調試問題時非常難以查明 – InSane 2010-08-29 15:32:13