【问题标题】:How to add foreign keys, references and indexes for comments如何为注释添加外键、引用和索引
【发布时间】:2015-09-15 16:49:28
【问题描述】:

我有一个类似的专栏:

CREATE TABLE `comments` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `thread_id` int(10) unsigned NOT NULL DEFAULT '0',
  `content` mediumtext NOT NULL,
  `parent_id` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
  • id - 唯一的评论标识符
  • thread_id - 该评论的线程
  • parent_id - 此评论的父评论

现在,该表中可以有两种类型的 cmets。一个是对主线程的注释(在这种情况下,thread_id 不为空),对注释的注释(在这种情况下,thread_id 为空,parent_id 不为空)。我想为 thread_id 和 parent_id 创建一个索引以进行优化,以及外键和引用,以便:

  1. 版主删除主线程,该线程的所有 cmets 以及可能的 cmets 也将递归删除
  2. 版主删除主线程中的一些评论,该评论及其子评论也将被递归删除

如果孩子将被删除,则不采取任何行动,因为没有“下面”。

我是这样尝试的:

 INDEX (parent_id, thread_id),
  FOREIGN KEY (parent_id, thread_id)
    REFERENCES (id)

但不确定是否可以,因为在同一张桌子上工作让我有点困惑。

【问题讨论】:

  • 那么,您的问题是什么?
  • 我会举一个例子来说明如何有效地做到这一点,尝试了一些事情,但由于某些原因它不起作用。
  • 我在考虑类似 INDEX (parent_id, thread_id), FOREIGN KEY (parent_id, thread_id) REFERENCES (id) 之类的东西,但不确定是否可以。

标签: mysql sql indexing foreign-keys


【解决方案1】:

设法创建了第一个有效的:

CONSTRAINT `comments_ibfk_1` 
  FOREIGN KEY (`thread_id`) 
    REFERENCES `threads` (`id`) ON DELETE CASCADE

现在,当我删除线程时,该线程的 cmets 也会被删除。

但是我坚持在 id 和 parent_id 之间的同一个表中创建外键,用于 cmets 和对 cme​​ts 的回复,知道吗?

Cannot add or update a child row: a foreign key constraint fails 
(`database`.`#sql-a4f_3796`, CONSTRAINT `#sql-a4f_3796_ibfk_2` 
FOREIGN KEY (`parent_id`) REFERENCES `comments` (`id`) ON DELETE CASCADE)

两个方向都试过,切换parent_id和id,没有效果。

【讨论】:

  • 不要在回答帖子中提问。这甚至是问题帖子的答案吗?如果是这样,请编辑掉不是答案的部分。如果不是答案而是对问题帖子的更改,请删除此并编辑问题帖子。 How to AnswerHow to AskHelp center
猜你喜欢
  • 1970-01-01
  • 2019-07-02
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 2014-06-20
相关资源
最近更新 更多