错误消息:无法删除或更新父行:外键约束失败

时间:2015-06-17 07:34:40

标签: mysql sql constraints

执行我的doDelete.php时,会显示以下错误消息:

“无法删除或更新父行:外键约束失败(fypbook,CONSTRAINT book_user_key FOREIGN KEY(id)参考{{1} }(user)ON DELETE NO ACTION ON UPDATE NO ACTION)“

删除查询:

id

来自3个表的检索信息查询:

$queryDelete = "DELETE FROM user  WHERE id = $theUserID";

我的'book'和'user'表之间的关系是用户能够添加一本书。因此,用户ID被放置在书籍表中以识别哪个用户添加书籍。但是,当我想从我的PHP删除用户时,出现上述错误消息。这是检索用户ID以删除用户的片段。我该如何解决这个问题?

$query2 = "SELECT * FROM user,country,book where book.id=user.id AND user.country_id=country.country_id ORDER BY  `user`.`id` ASC";

以下是相关表格

<td><form method="post" action="doDelete.php"><input type="hidden" name="theUserID" value="<?php echo $rows['id']; ?>" /><input type="submit" value="Delete" /</form></td>

3 个答案:

答案 0 :(得分:1)

实际上,您在书籍表中有一个约束,只要该用户添加了书籍,就不会删除用户:

CONSTRAINT `book_user_key`
FOREIGN KEY (`user_id`)
REFERENCES `fyp`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION

您可以将其更改为

ON DELETE CASCADE

这样删除用户也会删除所有图书。

或者您可以将约束设置为

ON DELETE SET NULL

并从book.user_id中删除NOT NULL:这将保留已删除用户的书籍,但将其user_id设置为NULL。

答案 1 :(得分:0)

您无法创建用户记录,因为它在 book 表中包含相关记录。这是外键约束的工作原理。您在此行中创建了此约束:

FOREIGN KEY (`user_id`) REFERENCES `fyp`.`user` (`id`) 
ON DELETE NO ACTION
ON UPDATE NO ACTION

要解决此问题,您可以:

  1. 用户表中删除给定用户之前,删除 book 表中指定用户ID的记录。这将需要逐个执行2个DELETE语句。
  2. 修改外键并使用ON DELETE CASCADE。这将导致 book 表中的记录将与 user 表中的相关记录一起自动删除。
  3. 我更喜欢解决方案1,因为它可以让您获得更多控制权。它也不易出错,因为您必须始终显式删除2个表中的记录。在第二种情况下,您可能会意外地从数据库中删除大量数据。

答案 2 :(得分:0)

我相信您在 Book 表中有一个或多个 user_id (您要删除的)数据。

由于用户表中的 user_id 用户中的外键 ID strong>表格,然后用户表格上的任何删除操作都将受到约束 book_user_key )的限制。

您可以在SQL中使用此查询来检查数据是否存在:

SELECT * FROM fyp.book WHERE user_id = ***[UserIDWhichYouWantToDelete]***

接下来就是,如果你在Book表中已有“User”数据,你打算做什么?

您可以在许多网站上找到更多关于 FOREIGN_KEY 的文献。