Я не могу удалить свое изображение, когда оно нравится из-за внешнего ключа в mysql

Вот схема моей БД:

Я не могу удалить свое изображение, когда оно нравится из-за внешнего ключа в 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"] }"

Но я не выбираю scores.id при выборе моей функции listPictures_session. Поэтому я попытался добавить 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"]));
}

Как я могу решить эту проблему, чтобы я мог удалить свое изображение? Большое спасибо и хорошего дня

I still get a mysql error because of the GROUP BY...что ты имеешь в виду? Вы не можете группировать в DELETE. Вам нужно удалить фактические строки, а не агрегированные вычисления. Покажите нам конкретно, какой запрос DELETE вы пытались выполнить, чтобы удалить лайки.
ADyson 13.05.2022 11:03

Также имейте в виду, что мы ничего не можем увидеть о вашей схеме, и вы также не предоставили образцы данных, поэтому мы работаем вслепую. Попробуйте отредактировать свой вопрос. См. также Как спросить и как создать минимальный воспроизводимый пример вашей задачи.

ADyson 13.05.2022 11:04

Ваша таблица scores, похоже, имеет ограничение внешнего ключа для таблицы pictures. Если вы хотите удалить изображения, вам сначала нужно удалить все ссылки на эти изображения в других таблицах.

M. Eriksson 13.05.2022 11:07

Я имею в виду функцию "listpictures_session" GROUP BY. Я попытался добавить «scores.id» в выбор, но когда я это делаю, у меня возникает ошибка, связанная с GROUP BY

bkbn 13.05.2022 11:08

В порядке. Но из вашего поста кажется, что речь идет об удалении, а не о выборе? Вам нужно будет редактировать задать вопрос, чтобы правильно уточнить, что вы пытаетесь сделать с этим выбором, и как это связано с вашим вопросом об удалении.

ADyson 13.05.2022 11:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
32
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

внешний ключ таблицы (`test`.`scores`) ссылка на таблицу pictures

вы должны удалить записи (`test`.`scores`) ссылки на pictures перед удалением записи pictures

Я не думаю, что ваша ошибка GROUP BY имеет отношение к вашей реальной проблеме.

По сути, если у вас есть строки в scores, которые относятся к определенному идентификатору изображения, вы должны удалить все строки из scores, которые содержат этот идентификатор изображения, прежде чем вы сможете удалить связанную строку в pictures.

например

DELETE FROM scores WHERE picture_id = :id

DELETE FROM pictures WHERE id = :id

Хорошо, я понимаю, поэтому я делаю первую функцию для удаления оценок, а вторую — для удаления изображения? На мой взгляд, я выполнял этот цикл: "$pictures = $this->model->listPictures_session(); foreach ($pictures as $picture) { if ($picture["owner_id"] == $_SESSION["id" ]) { echo picture["id"] }" Но когда я попытался добавить "scores.id" в функцию listPictures_session(), у меня возникла ошибка GROUP BY

bkbn 13.05.2022 11:23

Да, я действительно не понимаю, почему вам нужно что-то делать в своем цикле, чтобы получить идентификатор счета. Вам не нужно знать какой-либо конкретный идентификатор оценки — вы можете просто удалить все оценки, которые имеют соответствующий идентификатор изображения, как я показал.

ADyson 13.05.2022 11:44
Ответ принят как подходящий

Насколько я понимаю, на самом деле вы хотите удалить строку из таблицы pictures. У вас есть ограничение внешнего ключа в scores на scores.picture_id, которое ссылается на 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. Это вызвано тем, что одна или несколько строк в таблице scores содержат picture_id ссылку на pictures.id. Вы не можете удалить строку в pictures, не удалив все ссылки на нее. Вы можете либо установить ссылку на null, если столбец ссылок позволяет null, либо вы можете полностью удалить строку. Насколько я могу судить, эта таблица используется для хранения пользовательских рейтингов изображений других пользователей, и строки в этой таблице не имеют смысла без идентификатора изображения, на который он ссылается, поэтому ваш лучший подход здесь, вероятно, состоит в том, чтобы удалить оскорбительные строки. вообще. Вы можете сделать это как часть процесса удаления:

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"]
        ]);
}

Другие вопросы по теме