【问题标题】:Deleting rows from other tables if row is deleted from main table如果从主表中删除行,则从其他表中删除行
【发布时间】:2010-08-29 23:34:32
【问题描述】:

我有一个名为“pages”的表格。每个页面都有文本、视频或图像的内容类型。根据内容类型的不同,记录也会插入到文本、视频或图像表中。

当我从“页面”中删除一行时,如何确保删除另一个表中的行?我对 CASCADE 有点了解,但我没有使用外键。至少不明确。

我的表格如下所示(我已删除与问题无关的字段)

页面:id、标题、内容

视频:pid(页面 id)、youtube_url

任何帮助将不胜感激。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如果你的表是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

    另一种方法是声明 trigger - 在删除之前

    手册:

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

    你可以找到一个小例子:

    Trigger before delete MySql

    【讨论】:

    • 不,我没有使用 InnoDB。我能看到的解决它的唯一其他方法是从父表中删除一行时,检查内容类型并从子表中删除该行。不过我确信有更好的解决方案。
    • 你可以声明触发器,是我写的2选项
    • +1 - 在数据库级别,这是 2 个选项。但是,我建议,如果可能的话,使用事务在应用程序级别进行。级联删除和数据库触发器都可能成为维护的噩梦,因为它们在调试问题时很难查明
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多