从表中删除时出现外键约束错误

时间:2012-05-28 13:35:35

标签: mysql

我有两张桌子:

请求 - Request_id,Request_Message; //包含请求

响应 - Response_id,Request_id,Response_Message; //包含请求的响应.. Request_id是此表的外键

现在我正在运行查询从请求中删除Request_id =" REQ001&#34 ;; .. ..如果响应表中没有相应的响应,那么查询工作正常,其他给出外键约束错误。

我希望当我从请求表中删除任何请求时,所有相应的响应必须自动从响应表中删除..如何实现这一点?

谢谢你的时间..

Devesh

5 个答案:

答案 0 :(得分:2)

尝试在删除时使用级联:

create table Responses(
...
CONSTRAINT fk_column
  FOREIGN KEY (Request_id)
  REFERENCES Requests (Request_id)
  ON DELETE CASCADE
);

答案 1 :(得分:1)

在定义子表(具有外键)结构时使用Cascade Delete。

CREATE TABLE `Responses ` 
  ( 
     `Request_id` INT(10), 
     INDEX (Request_id), 
     FOREIGN KEY (Request_id) REFERENCES Requests (Request_id) ON DELETE CASCADE 
  ) 

请记住,您需要使用InnoDB存储引擎:默认的MyISAM存储引擎不支持外键。

答案 2 :(得分:1)

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';

这是我首选的解决方案,因为它更加明确了实际发生的事情。

答案 3 :(得分:0)

您需要首先删除引用您要删除的Responses的所有Request_id条记录,或者您需要将外键定义为ON DELETE CASCADE

答案 4 :(得分:0)

FOREIGN KEY约束的MySQL手册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设置为与{{1}}中删除的记录相同的值表