我有两张桌子:
请求 - Request_id , Request_Message;// 包含请求
响应 - Response_id 、 Request_id 、 Response_Message;// 包含请求的响应。Request_id 是该表的外键
现在,当我从请求中删除 Request_id = "REQ001"; ...
我想当我从请求表中删除任何请求时,所有相应的响应都必须从响应表中自动删除。如何实现这一点?
谢谢你的时间..
德韦什
我有两张桌子:
请求 - Request_id , Request_Message;// 包含请求
响应 - Response_id 、 Request_id 、 Response_Message;// 包含请求的响应。Request_id 是该表的外键
现在,当我从请求中删除 Request_id = "REQ001"; ...
我想当我从请求表中删除任何请求时,所有相应的响应都必须从响应表中自动删除。如何实现这一点?
谢谢你的时间..
德韦什
尝试在删除时使用级联:
create table Responses(
...
CONSTRAINT fk_column
FOREIGN KEY (Request_id)
REFERENCES Requests (Request_id)
ON DELETE CASCADE
);
在定义子表(将具有外键)结构时使用级联删除。
CREATE TABLE `Responses `
(
`Request_id` INT(10),
INDEX (Request_id),
FOREIGN KEY (Request_id) REFERENCES Requests (Request_id) ON DELETE CASCADE
)
请记住,您需要使用 InnoDB 存储引擎:默认的 MyISAM 存储引擎不支持外键。
在约束CASCADE
的定义中使用是一种选择。FOREIGN KEY
但是,我建议使用 delete 语句的多表语法,例如:
DELETE FROM Requests, Responses
USING Requests
LEFT JOIN Responses ON Requests.Request_id=Responses.Request_id
WHERE Requests.Request_id='REQ001';
这是我首选的解决方案,因为它更明确地说明了实际发生的情况。
您需要先删除所有Responses
引用Request_id
您要删除的记录,或者您需要将外键定义为ON DELETE CASCADE
.
如 MySQLFOREIGN KEY
约束手册中所述,http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html,如果你想让数据库处理这个而不是你的应用程序,您必须将您的更改CONSTRAINT
为:
CONSTRAINT my_constraint FOREIGN KEY request_id (request_id) REFERENCES Requests (request_id) ON DELETE CASCADE;
该ON DELETE CASCADE
部分将负责删除表中的记录,这些记录的Responses
值request_id
设置为与表中要删除的记录相同的值Requests
。