2016-05-07 3 views
2

У меня есть две таблицы. user и comment. Я хотел, чтобы пользователи могли проголосовать за комментарии, поэтому я сделал еще одну таблицу под названием user_vote_comment. Я позволяю столбцу id в таблице user, а столбец id в таблице comment представляет собой составной первичный ключ в таблице user_vote_comment.Не удается удалить строку из-за ограничения внешнего ключа

enter image description here

Это структура user_vote_comment таблицы:

CREATE TABLE IF NOT EXISTS `user_vote_comment` (
    `user_id` INT(11) UNSIGNED NOT NULL, 
    `comment_id` INT(11) UNSIGNED NOT NULL, 
    PRIMARY KEY (`user_id`, `comment_id`), 
    INDEX `fk_user_vote_comment_comment1_idx` (`comment_id` ASC), 
    CONSTRAINT `fk_user_vote_comment_user1` 
    FOREIGN KEY (`user_id`) 
    REFERENCES `user` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_user_vote_comment_comment1` 
    FOREIGN KEY (`comment_id`) 
    REFERENCES `comment` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 

Теперь я добавил несколько строк в user_vote_comment, но тогда я хотел удалить несколько голосов, потому что я хотел, чтобы пользователи имели такую ​​возможность , чтобы отозвать. Но затем я получаю это сообщение об ошибке:

Error 1451: Cannot delete or update a parent row: a foreign key constraint fails (`user_vote_comment`, CONSTRAINT `fk_user_vote_comment_comment1` FOREIGN KEY (`comment_id`) REFERENCES `comment` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) 

Я думал, что таблица пользователя и комментариев была родительскими таблицами здесь? Поскольку имеет смысл, что это ограничение, если я должен был удалить пользователя или комментарий, тогда я должен получить ошибку, потому что некоторые строки в user_vote_comment зависят от этой информации, но не наоборот?

Я не понимаю, почему я не могу удалить строки в user_vote_comment, я чувствую, что я слишком ограничен, если я даже не могу удалить строки из него.

Что мне делать?

+0

Я не уверен, почему вы пытаетесь удалить ограничение внешнего ключа при попытке удалить строку из 'user_vote_comment', но' ON DELETE NO ACTION' предотвратит удаление строки в 'comment' или' user' таблице, которая ссылается на строку в таблице 'user_vote_comment', чтобы избежать сиротских записей. То же самое относится к' ON UPDATE NO ACTION', что предотвратит обновление первичного ключа строк в 'comment' или' user', на который ссылается 'user_vote_comment таблицу. Что касается согласованности данных, я думаю, вы должны указать 'ON DELETE CASCADE', если вы разрешите удаление пользователей и комментарии. –

ответ

1

Я не думаю, что ничего плохого с SQL. Может быть, вы пропустили упоминание чего-то еще в вышеупомянутой проблеме, которая вызывает проблему?

Я быстро проверил SQLFiddle (http://www.sqlfiddle.com/#!9/c726aa/1/0), и я могу просто удалить из таблицы USER_VOTE_COMMENT.

-1

Вы можете установить ON DELETE CASCADE вместо ON DELETE NO ACTION

+1

Не будет ли пытаться удалить всех пользователей и комментарии? Поскольку он думает, что это детские таблицы, когда это должно быть наоборот. – Alex

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