2009-11-18 89 views
0

刪除多個列我有兩個表是這樣的:MySQL的兩個表

Table categories: 
columns: id, name, parent 
1, Foods, 0 
2, Drinks, 0 
3, FastFood, 1 
4, Hamburger, 3 

Table documents: 
columns: id, name, categoryID 
1, CheseBurger, 4 
2, shop, 3 

父列有父類的ID。所以,當我想從類別中刪除食品條目時,我想要刪除所有的子類別和文檔。

我該怎麼做?

回答

1

變化正如前面提到的,你可以使用FOREIGN KEY CONSTRAINTS實現這樣的任務。下面將是你的MySQL的新表結構,以支持自動刪除文檔和子類別:

CREATE TABLE categories (
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(30) NOT NULL, 
    parent INT(11) UNSIGNED, 
    INDEX(parent), 
    FOREIGN KEY (parent) REFERENCES categories(id) ON DELETE CASCADE  
) engine=InnoDB; 

CREATE TABLE documents (
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(30) NOT NULL, 
    categoryID INT(11) UNSIGNED NOT NULL, 
    INDEX(categoryID), 
    FOREIGN KEY (categoryID) REFERENCES categories(id) ON DELETE CASCADE 
) engine=InnoDB; 
+0

所以當我試圖刪除語法應該如何? – Valour 2009-11-18 13:57:05

+0

INSERT INTO'docs'.'categories'( 'id', 'name', 'parent' ) VALUES( NULL, '樣品', '0' ) #1452 - 不能添加或更新子行:外鍵約束失敗('docs/categories',CONSTRAINT'categories_ibfk_1' FOREIGN KEY('parent')REFERENCES'categories'('id')ON DELETE CASCADE) 我收到此錯誤當試圖從phpMyAdmin插入一行 – Valour 2009-11-18 14:06:49

+0

在這種情況下,您引用的是不存在的0的categories.id。這導致您的外鍵約束失敗。對於父類別(根級別),您可能需要將此值設置爲NULL。 – 2009-11-18 14:08:57

0

我要麼使用觸發器,要麼創建一個更詳細的「刪除」存儲過程來處理它。

0

某些數據庫支持通過外鍵強制實施參照完整性。我用Oracle做過,但我不是mysql專家。它通過關鍵字「CASCADE DELETE」作爲外鍵的屬性完成。數據庫會自動爲您處理。

下面是一個簡單的Oracle例如:

ALTER TABLE Things ADD CONSTRAINT FK_Things_Stuff 
    FOREIGN KEY (ThingID) REFERENCES Stuff (ThingID) 
ON DELETE CASCADE 
; 
0

你有兩個選擇 - 在任何情況下,我建議你爲你的人際關係建立外鍵約束。

選擇1是使用ON DELETE CASCADE。不過,我認爲這不是一個好的做法,因爲意外刪除會帶來相當令人驚訝的後果。

選擇2是走樹,找到需要刪除的記錄。您可以對您的分類表使用自聯接來標識層次結構中n級的所有子項。這是最好的方法,imo。

觸發器像其他的想法只是一個2