由于 mysql 中的外键,我无法在喜欢时删除我的图像

I can't delete my image when it is liked because of the foreign key in mysql

有我的数据库的架构:

我在尝试删除图片时收到此错误消息:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`test`.`scores`, CONSTRAINT `scores_ibfk_2` FOREIGN KEY (`picture_id`) REFERENCES `pictures` (`id`)) in /Applications/MAMP/htdocs/legogram/app/model/model.php:173

当我的图片不被点赞时,我可以删除它,但当它被点赞时,我不能

这是列出我的图片的函数:

    public function listPictures_session()
{
    $this->open();
    $stmt = $this->pdo->prepare("SELECT pictures.id, pictures.owner_id, pictures.title, pictures.description, pictures.path,
    SUM(scores.score)/COUNT(scores.id) AS 'score'
    FROM pictures LEFT OUTER JOIN scores ON pictures.id=scores.picture_id 
    GROUP BY pictures.id
    ORDER BY pictures.id DESC LIMIT 100");
    $stmt->execute();
    return $stmt->fetchAll();
}

以及我对它的称呼:

    $pictures = $this->model->listPictures_session(); 
foreach ($pictures as $picture) { 
if ($picture["owner_id"] == $_SESSION["id"]) { 
echo picture["id"] }"

但是我的 listPictures_session 函数的 select 中没有 select scores.id。所以我尝试添加一个SELECT scores.id,这样我可以在第一时间删除它。但是当我尝试将 scores.id 添加到 SELECT 时,出现 GROUP BY 错误。

我以这种方式添加了 scores.id,但它不起作用:

    SELECT pictures.id, pictures.owner_id, pictures.title, pictures.description, pictures.path,
    SUM(scores.score)/COUNT(scores.id) AS 'score', scores.id

以及删除它的函数:

    public function deletepicture($user)
{
    $this->open();
    $stmt = $this->pdo->prepare("DELETE FROM pictures WHERE id=:id");
    return $stmt->execute(array(":id" => $user["id"]));
}

如何解决此问题以便删除我的图片?非常感谢,祝你有愉快的一天

table 的外键 (`test`.`scores`) 引用 table pictures

在删除 pictures

的记录之前,您必须删除 (`test`.`scores`) 引用 pictures 的记录

我认为您的 GROUP BY 错误与您的实际问题无关。

基本上,如果 scores 中有引用特定图片 ID 的行,则必须先删除 scores 中包含该图片 ID 的所有行,然后才能删除 pictures.

例如

DELETE FROM scores WHERE picture_id = :id

DELETE FROM pictures WHERE id = :id

在我看来,您真正想要做的是从 pictures table 中删除一行。 scores.picture_id 上的 scores 中有一个引用 pictures.id 的外键约束。这些都是好东西。

您的错误信息如下:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`test`.`scores`, CONSTRAINT `scores_ibfk_2` FOREIGN KEY (`picture_id`) REFERENCES `pictures` (`id`)) in /Applications/MAMP/htdocs/legogram/app/model/model.php:173

这意味着在尝试删除 pictures table 中的行时违反了此外键约束。这是由 scores table 中的一行或多行引起的,其中 picture_id 引用了 pictures.id。您不能在不删除对它的所有引用的情况下删除 pictures 中的行。如果引用列允许 null,您可以将引用设置为 null,或者您可以完全删除该行。据我所知,这个 table 用于存储用户对其他用户图片的评分,如果没有它引用的图片 ID,这个 table 中的行就没有意义,所以你最好的方法这里可能是完全删除有问题的行。您可以在删除过程中执行此操作:

public function deletepicture($user) {
    $this->open();
    $stmt = $this->pdo->prepare(
            <<<SQL
            DELETE FROM
                scores
            WHERE
                picture_id = :pictureId
            SQL
        );
    $stmt->execute([
            ":pictureId" => $user["id"]
        ]);
    $stmt = $this->pdo->prepare(
            <<<SQL
            DELETE FROM
                pictures
            WHERE
                id = :id
            SQL
        );
    return $stmt->execute([
            ":id" => $user["id"]
        ]);
}