由于 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"]
]);
}
有我的数据库的架构:
我在尝试删除图片时收到此错误消息:
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"]
]);
}