2014-03-05 152 views
0

我有一個多對多關係的簡短問題。 這裏是我的表:刪除正確的多對多關係

+---------+----------------+ 
| film_id | title   | 
+---------+----------------+ 
|  1 | Apocalypse Now | 
+---------+----------------+ 


+-------------+----------------------+ 
| category_id | name     | 
+-------------+----------------------+ 
|   1 | cool category  | 
+-------------+----------------------+ 
|   2 | not so cool category | 
+-------------+----------------------+ 

+---------+-------------+ 
| film_id | category_id | 
+---------+-------------+ 
|  1 |   1 | 
+---------+-------------+ 
|  1 |   2 | 
+---------+-------------+ 

正如你可以看到有從film FKS - 和category -table在film_category - 表。

我想要什麼:如果想刪除category,然後在film_categorycategory_id發生應該刪除,太所有條目。但不是相關的film s!除此之外:這應該工作,同時刪除film反之亦然! (這正是我的問題就在這裏)

我的問題:我能解決這個問題,只有一個FK-定義或做我必須刪除film_category - 表中的所有條目刪除filmcategory之前手動?

+0

您可以用正常的做到這一點'ON DELETE CASCADE'參照觸發外鍵的動作。 – GarethD

+0

當我這樣做,然後刪除一個'類別',相關的'電影'也被刪除。 – Sonnywhite

+0

你可以發表你的表和外鍵的定義,[在sql小提琴](http://sqlfiddle.com/#!2/8f8ae0/1)我已經完成,當一個類別被刪除時,它只會刪除film_category中的行與該category_id,並保持電影表不變。 – GarethD

回答

1

您的表格應該如下所示。電影表中的刪除應刪除電影類別具有相同ID的行,反之亦然。

CREATE TABLE `film` (
    `film_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`film_id`) 
) ENGINE=InnoDB; 

CREATE TABLE `category` (
    `category_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`category_id`) 
) ENGINE=InnoDB; 

CREATE TABLE `film_category` (
`film_category_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`film_id` int(10) unsigned NOT NULL DEFAULT '0', 
`category_id` int(10) unsigned NOT NULL DEFAULT '0', 
PRIMARY KEY (`film_category_id`), 
KEY `film_id` (`film_id`), 
KEY `category_id` (`category_id`), 
CONSTRAINT `film_category_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `category` (`category_id`) ON DELETE CASCADE, 
CONSTRAINT `film_category_ibfk_1` FOREIGN KEY (`film_id`) REFERENCES `film` (`film_id`) ON DELETE CASCADE 
) ENGINE=InnoDB; 

你也應該能夠使用film_category如下:

CREATE TABLE `film_category` (
    `film_id` int(10) unsigned NOT NULL DEFAULT '0', 
    `category_id` int(10) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`film_id`,`category_id`), 
    CONSTRAINT `film_category_ibfk_1` FOREIGN KEY (`film_id`) REFERENCES `film` (`film_id`) ON DELETE CASCADE, 
    CONSTRAINT `film_category_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `category` (`category_id`) ON DELETE CASCADE 
) ENGINE=InnoDB; 
+0

與我的表格不同的是,你的'film_category'有自己的ID,只有這個PK。我的'film_category'沒有自己的ID,並且用'film_id' +'category_id'投射了一個複合PK。那麼你是否認爲這是刪除一個'category'時它刪除的問題還有相關的'電影'? – Sonnywhite

+0

我在上面添加了複合主鍵的film_category表格示例。如果刪除category.category_id 1,那麼它應該只刪除第1,1行,但在film_category表中保留1,2。 – Blergh