2014-03-05 119 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