2010-08-29 206 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