首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >外键冲突:7错误

外键冲突:7错误
EN

Stack Overflow用户
提问于 2014-10-01 21:05:05
回答 2查看 4.7K关注 0票数 0

在这方面我真的是新手。问题是..。我有文章网站。人们可以在那里给文章打分。如果没有人评价,我可以删除文章。但如果有人给文章打分,我总是得到以下错误:

代码语言:javascript
运行
复制
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

当我检查该文件时,有以下代码:

代码语言:javascript
运行
复制
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的外观

代码语言:javascript
运行
复制
    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

EN

回答 2

Stack Overflow用户

发布于 2014-10-01 21:15:48

它确实在你得到的错误消息中说明了这一点,你有一个外键引用冲突。这意味着您正在尝试删除数据库中某处引用的行,它甚至会告诉您位置:

代码语言:javascript
运行
复制
is still referenced from table "article_ratings"

也可以使用ON DELETE CASCADE http://www.mysqltutorial.org/mysql-on-delete-cascade/删除引用行

在SO上有一个关于这方面的问题:MySQL on delete cascade. Test Example

这里有一个很好的解释:https://dba.stackexchange.com/questions/44956/good-explanation-of-cascade-on-delete-update-behavior

编辑:在Postgres上:

代码语言:javascript
运行
复制
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

票数 1
EN

Stack Overflow用户

发布于 2014-10-01 22:29:31

作为@hebron给出的答案的另一个选择,它依赖于更改外键级联删除行为,您可能会发现在代码中跨连接删除更直接和更容易理解(即,不依赖于“隐藏”的数据库行为)。

代码语言:javascript
运行
复制
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 = ?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26142080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档