【发布时间】: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