Я действительно новичок в этом деле. Дело в том … У меня есть статья на сайте. Люди могут оценивать статьи там. Если никто не оценил, я могу удалить статью. Но если кто-то оценил статью, я продолжаю получать следующую ошибку:
PDOException: SQLSTATE[23503]: Foreign key violation: 7 ERROR: update or delete on table "article" violates foreign key constraint "article_rating_item_id_fkey" on table "article_ratings"DETAIL: Key (id)=(xxxx) is still referenced from table "article_ratings". in /libs/Nette/loader.php:3515 @ http://www.xxxxxx/admin/articleedit/3578?do=deletearticle @@ exception-2014-09-29-18-14-37-b625334b3e569cb7661f1704256874c1.htm
Когда я проверяю этот файл, появляется следующий код:
public function handleDeletearticle($id)
{
$article = $this->context->createArticles()->get($id);
$this->context->createArticles()->where("id", $id)->delete();
$this->flashMessage('Done', 'success');
$this->redirect('Admin:articles');
}
Не могли бы вы помочь мне, как это исправить? заранее спасибо
РЕДАКТИРОВАТЬ: это выглядит как Articles.php
public function selectArticleWithRating($slug)
{
$article = $this->query("Select article.*, COUNT(rating.id) AS plus, COUNT(rating2.id) AS minus, \"user\".avatar, \"user\".username
FROM article
LEFT JOIN rating AS rating ON rating.item_id=article.id and rating.type='article' and rating.rate=1
LEFT JOIN rating AS rating2 ON rating2.item_id=article.id and rating2.type='article' and rating2.rate=0
LEFT JOIN \"user\" ON \"user\".id=article.user_id
WHERE slug='$slug'
GROUP BY article.id, \"user\".id");
return $article;
}
Там не должно быть article_ratings
?
Это действительно говорит о том, что в полученном вами сообщении об ошибке у вас есть нарушение ссылки на внешний ключ. Это означает, что вы пытаетесь удалить строку, на которую ссылается где-то в вашей базе данных, она даже сообщает вам, где:
is still referenced from table "article_ratings"
Вы также можете удалить строку ссылки, используя ON DELETE CASCADE
http://www.mysqltutorial.org/mysql-on-delete-cascade/
Есть вопрос, касающийся этого здесь, на SO: MySQL на каскаде удаления. Тестовый Пример
И отличное объяснение здесь: https://dba.stackexchange.com/questions/44956/good-explanation-of-cascade-on-delete-update-behavior
Редактировать: На Postgres:
CREATE TABLE order_items (
product_no integer REFERENCES products ON DELETE RESTRICT,
order_id integer REFERENCES orders ON DELETE CASCADE,
quantity integer,
PRIMARY KEY (product_no, order_id)
);
http://www.postgresql.org/docs/9.3/static/ddl-constraints.html
В качестве другого варианта ответа, данного @hebron, который основывается на изменении поведения каскадного удаления внешнего ключа, вы можете найти его более простым и понятным в вашем коде (то есть, не полагаясь на «скрытое» поведение базы данных) для удаления через объединение.
DELETE articles, article_ratings
FROM articles
LEFT JOIN article_ratings
ON articles.id = article_ratings.article_id /* or whatever your foreign key name is */
WHERE articles.id = ?