У меня есть две таблицы. user
и comment
. Я хотел, чтобы пользователи могли проголосовать за комментарии, поэтому я сделал еще одну таблицу под названием user_vote_comment
. Я позволяю столбцу id
в таблице user
, а столбец id
в таблице comment
представляет собой составной первичный ключ в таблице user_vote_comment
.Не удается удалить строку из-за ограничения внешнего ключа
Это структура 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
, я чувствую, что я слишком ограничен, если я даже не могу удалить строки из него.
Что мне делать?
Я не уверен, почему вы пытаетесь удалить ограничение внешнего ключа при попытке удалить строку из 'user_vote_comment', но' ON DELETE NO ACTION' предотвратит удаление строки в 'comment' или' user' таблице, которая ссылается на строку в таблице 'user_vote_comment', чтобы избежать сиротских записей. То же самое относится к' ON UPDATE NO ACTION', что предотвратит обновление первичного ключа строк в 'comment' или' user', на который ссылается 'user_vote_comment таблицу. Что касается согласованности данных, я думаю, вы должны указать 'ON DELETE CASCADE', если вы разрешите удаление пользователей и комментарии. –