自动删除连接数据以及删除记录?

Posted

技术标签:

【中文标题】自动删除连接数据以及删除记录?【英文标题】:Automatically delete junction data along with DELETE of a record? 【发布时间】:2013-04-21 01:03:49 【问题描述】:

我有用户,有优惠,还有一个联结表 users_offers。

我是否可以使用外键关系进行设置,以确保在我删除任何用户或优惠时自动删除联结数据?

【问题讨论】:

触发器中的级联删除? 【参考方案1】:

声明一个引用动作:ON DELETE CASCADE,例如:

CREATE TABLE user (
    user_id int PRIMARY KEY
);

CREATE TABLE offer (
    offer_id int PRIMARY KEY
);

CREATE TABLE user_offer (
    user_id int,
    offer_id int,
    PRIMARY KEY (user_id, offer_id),
    FOREIGN KEY (user_id) REFERENCES user (user_id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES offer (offer_id) ON DELETE CASCADE
);

[SQL Fiddle]

有趣的是,在“速记”外键语法中指定引用操作似乎不起作用(在 mysql 5.5.30、5.6.6 m9 下确认)。以下内容被解析,但当user被删除时,对应的user_offer不会被删除:

CREATE TABLE user_offer (
    user_id int REFERENCES user (user_id) ON DELETE CASCADE,
    offer_id int REFERENCES offer (offer_id) ON DELETE CASCADE,
    PRIMARY KEY (user_id, offer_id)
);

【讨论】:

【参考方案2】:

您可以在创建模型时指定:

CREATE TABLE users_offers (user_id INT NOT NULL,
                           offer_id INT NOT NULL,
                           PRIMARY KEY (user_id, offer_id),
                           FOREIGN KEY (user_id) REFERENCES users(id)
                               ON DELETE CASCADE,
                           FOREIGN KEY (offer_id) REFERENCES offers(id)
                               ON DELETE CASCADE);

您可以在this Fiddle 中看到一个工作示例。

【讨论】:

以上是关于自动删除连接数据以及删除记录?的主要内容,如果未能解决你的问题,请参考以下文章

自动从 Mysql 表中删除的记录

sql server 每加一条数据实现自动加一,但怎么实现删除一条数据后自动减一

如何在一定时间后自动删除sql server中的记录[重复]

Oracle在windows下面的自动备份以及删除今天的脚本..

使用 angular.js 按自动编号字段删除记录

我现在mysql 一条数据插入后,有一个字段是记录的时间,如何的实现10天后自动的删除这条数据