2015-07-18 1 views
0

Новый вопрос, так как мне удалось найти ответ.Внешний ключ MySql из той же таблицы (2 столбца относятся к одной клавише)

Упражнение требует от нас создания таблицы комментариев с уровнями ответов. есть сообщение ('id'), в котором есть комментарии ('comment_id'), и есть поле ответа комментариев ('reply_to'), которое должно указывать на существующий комментарий ('comment_id') или NULL, если это комментарий к самому сообщению. 'id' & 'comment_id' являются основным ключом 'user_id' является внешним ключом для другой таблицы Мне нужен второй внешний ключ, который является полем ответа ('reply_to') и при удалении комментария следующие комментарии также должны быть удалены.

что мне удалось установить внешний ключ в 'comment_id', но затем , если есть много сообщений с тем же номером комментария, что вызывает хаос. удаление сообщения # 1 комментарий # 1 приведет к сообщению #x comment # 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)

Что еще я могу пропустить? Спасибо заранее!

ответ

0

Вы пытаетесь ссылаться два раза один и тот же столбец из таблицы postcomments с тем же идентификатором в должностях таблицы:

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`); 

Это не имеет никакой пользы.

Первый (id) в FOREIGN KEY заявление (так FOREIGN KEY (id)) является столбец в таблице, которую вы претендуете ограничение на (таблицы postcomments в данном случае).

Так что замените идентификатор вашего второго ограничения (во-первых, не имеет значения) с столбцом, на котором вы действительно хотите разместить ограничение.

Смежные вопросы