【发布时间】:2013-04-21 01:03:49
【问题描述】:
我有用户,有优惠,还有一个联结表 users_offers。
我是否可以使用外键关系进行设置,以确保在我删除任何用户或优惠时自动删除联结数据?
【问题讨论】:
-
触发器中的级联删除?
标签: mysql sql foreign-keys foreign-key-relationship junction-table
我有用户,有优惠,还有一个联结表 users_offers。
我是否可以使用外键关系进行设置,以确保在我删除任何用户或优惠时自动删除联结数据?
【问题讨论】:
标签: mysql sql foreign-keys foreign-key-relationship junction-table
声明一个引用动作: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
);
有趣的是,在“速记”外键语法中指定引用操作似乎不起作用(在 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)
);
【讨论】:
您可以在创建模型时指定:
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 中看到一个工作示例。
【讨论】: