来自同一个表的MySql外键(2列与一个键相关)

时间:2015-07-18 17:01:09

标签: mysql sql database phpmyadmin

自从我找到答案以来的新问题。

练习要求我们创建一个带有回复级别的评论表。 有一个帖子(' id')有评论(' comment_id')并且有一个 评论回复字段(' reply_to'),如果它是对帖子本身的评论,则需要指向现有评论(' comment_id')或NULL。 ' ID' &安培; ' COMMENT_ID'是主键 ' USER_ID'是不同表的外键 我需要第二个外键,即回复字段(' reply_to') 删除评论时,也应删除以下评论。

我成功的是将外键设置为' comment_id'但是之后 如果有很多帖子具有相同的评论号,则会导致混乱。 删除帖子#1评论#1将导致发布#x评论#9这是一个回复 评论#5(而不是#1)也要删除。

我应该如何定义密钥,以便只有正确的评论树 淘汰? (下面的数据库说明)

由于

实施例: TBL

post_id-----comment_id-----reply_to   
   0            0             NULL (to post)
   0            1              0
   1            0              NULL (to post)
   1            1              0

通缉行动:

Delete:       0            0             NULL (to post)

想要的结果:

post_id-----comment_id-----reply_to   
   1            0              NULL (to post)
   1            1              0

=============================================== ============================

修正:需要添加索引

练习要求我们创建一个带有回复级别的评论表。 有一个帖子(' id')有评论(' comment_id')并且有一个 评论回复字段(' reply_to'),如果它是对帖子本身的评论,则需要指向现有评论(' comment_id')或NULL。 ' ID' &安培; ' COMMENT_ID'是主键 ' USER_ID'是不同表的外键 我需要第二个外键,即回复字段(' reply_to') 删除评论时,也应删除以下评论。

我正在尝试从同一个表中添加一个外键但我一直在增加 这个错误:

#1005 - Can't create table db.#sql-148f_1027d34' (errno: 150)

以下是表格的定义:

CREATE TABLE IF NOT EXISTS `PostComments` (
  `id` int(11) NOT NULL,
  `comment_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `content` varchar(512) COLLATE utf8_unicode_ci NOT NULL,
  `reply_to` int(11) DEFAULT NULL,
  `rating` int(11) NOT NULL DEFAULT '0',
  `report_counter` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`,`comment_id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


ALTER TABLE `PostComments`
  ADD CONSTRAINT `PostComments_ibfk_1` FOREIGN KEY (`id`) REFERENCES `Posts` (`id`),
  ADD CONSTRAINT `PostComments_ibfk_2` FOREIGN KEY (`id`) REFERENCES `Posts` (`id`),
  ADD CONSTRAINT `PostComments_ibfk_3` FOREIGN KEY (`user_id`) REFERENCES `Users` (`id`);

这就是我想要做的事情:

ALTER TABLE `PostComments`
ADD CONSTRAINT `fk_ReplyToT`
FOREIGN KEY (`reply_to`)
REFERENCES `PostComments` (`comment_id`)
ON DELETE CASCADE

在几个不同的线程中漫步后,我尝试删除所有的线程 此表中的条目但仍然没有成功。 字段也具有相同的类型(INT)

我可能还缺少什么? 提前谢谢!

1 个答案:

答案 0 :(得分:0)

您试图在表格帖子中使用相同ID的同一列引用两次相同的列:

ALTER TABLE `PostComments`
  ADD CONSTRAINT `PostComments_ibfk_1` FOREIGN KEY (`id`) REFERENCES `Posts` (`id`),
  ADD CONSTRAINT `PostComments_ibfk_2` FOREIGN KEY (`id`) REFERENCES  `Posts` (`id`),
  ADD CONSTRAINT `PostComments_ibfk_3` FOREIGN KEY (`user_id`) REFERENCES `Users` (`id`);

没用。

FOREIGN KEY语句中的第一个(id)(所以FOREIGN KEY id)是您正在应用约束的表中的列(在这种情况下的postcomments表。)

所以用实际想要放置约束的列替换第二个约束的id(首先,无关紧要)。