【问题标题】:MySql foreign key from the same table (2 columns are relevant to one key)同一张表的MySql外键(2列与一个键相关)
【发布时间】:2015-10-08 05:12:05
【问题描述】:

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

练习希望我们创建一个带有回复级别的 cmets 表。 有一个帖子 ('id') 有 cmets ('comment_id') 并且有一个 需要指向现有评论 ('comment_id') 的评论回复字段 ('reply_to') 或 NULL,以防它是对帖子本身的评论。 'id' & 'comment_id' 是主键 'user_id' 是不同表的外键 我需要第二个外键,即回复字段('reply_to') 并且在删除评论时,也应删除以下 cmets。

我成功的是将外键设置为“comment_id”,但随后 如果有许多帖子具有相同的评论编号,则会导致混乱。 删除帖子 #1 评论 #1 将导致帖子 #x 评论 #9 这是回复 评论 #5(而不是 #1)也将被删除。

我应该如何定义键,以便只有正确的评论树将是 被淘汰? (下面对db的描述)

谢谢

示例: 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

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

固定:需要添加索引

练习希望我们创建一个带有回复级别的 cmets 表。 有一个帖子 ('id') 有 cmets ('comment_id') 并且有一个 需要指向现有评论 ('comment_id') 的评论回复字段 ('reply_to') 或 NULL,以防它是对帖子本身的评论。 'id' & 'comment_id' 是主键 'user_id' 是不同表的外键 我需要第二个外键,即回复字段('reply_to') 并且在删除评论时,也应删除以下 cmets。

我正在尝试从同一个表中添加一个外键,但我不断收到 这个错误:

#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)

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

【问题讨论】:

    标签: mysql sql database phpmyadmin


    【解决方案1】:

    您正试图从 postcmets 表中引用相同的列两次,并且在表 posts 中具有相同的 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))是您应用约束的表中的列(此表中的 postcmets 表)案例)。

    因此,将您的第二个约束(第一个,无关紧要)的 id 替换为您实际要放置约束的列。

    【讨论】:

      猜你喜欢
      • 2018-06-13
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      相关资源
      最近更新 更多