Использование внешнего ключа в той же таблице - PullRequest
5 голосов
/ 03 июня 2019

Я создал в своей базе данных таблицу с именами категорий:

CREATE TABLE IF NOT EXISTS `category` 
( `categoryName` varchar(128)  ,
 `subcategoryName` varchar(128) ,
 PRIMARY KEY (`categoryName`) )
 ENGINE=InnoDB DEFAULT CHARSET=latin1

Категория в этой таблице может быть подкатегорией другой категории в этом поле. Итак, подкатегория - FK для категорий. Инициализация:

    ALTER TABLE `category` ADD FOREIGN KEY (`subcategoryName`) 
REFERENCES `category`(`categoryName`) ON DELETE RESTRICT ON UPDATE RESTRICT;

Поэтому я попытался вставить значения в эту таблицу следующим образом:

INSERT INTO `category` (`categoryName`, `subcategoryName`) VALUES
( 'Literature','Satire'),
( 'Science','Mathematics'),
( 'Science','Physics');

но я получаю эту ошибку:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`php_beginner_crud_level_1`.`category`, CONSTRAINT `category_ibfk_1` FOREIGN KEY (`subcategoryName`) REFERENCES `category` (`categoryName`))

Я думаю, это означает, что я могунет подкатегории, если категория еще не существует. Итак, что я сделал, это вставил первые отдельные категории:

INSERT INTO `category` (`categoryName`) VALUES
( 'Literature'),
( 'Mathematics'),
( 'Programming');

Как я могу вставить подкатегории для этих категорий сейчас?например, если я хочу подкатегорию: Java для программирования, как я могу вставить ее в таблицу?

1 Ответ

4 голосов
/ 03 июня 2019

У вас есть отношение внешнего ключа в обратном направлении.Подкатегории ссылаются на категории, поэтому должно быть:

ALTER TABLE `category` ADD FOREIGN KEY (`categoryName`) 
REFERENCES `category`(`subcategoryName`) ON DELETE RESTRICT ON UPDATE RESTRICT;

И первичный ключ должен быть subcategoryName, а не categoryName.

Вам необходимо создать подкатегории без категории для верхнейкатегории высокого уровня в иерархии.

INSERT INTO `category` (`categoryName`, `subcategoryName`) VALUES
(NULL, 'Literature'),
(NULL, 'Science'),
( 'Literature','Satire'),
( 'Science','Mathematics'),
( 'Physics','Science');

Или переименуйте вещи, чтобы иметь больше смысла.

CREATE TABLE IF NOT EXISTS `category` 
( `categoryName` varchar(128)  NOT NULL,
 `supercategoryName` varchar(128) ,
 PRIMARY KEY (`categoryName`) )
 ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `category` ADD FOREIGN KEY (`supercategoryName`) 
REFERENCES `category`(`categoryName`) ON DELETE RESTRICT ON UPDATE RESTRICT;

INSERT INTO `category` (`categoryName`, `subcategoryName`) VALUES
(NULL, 'Literature'),
(NULL, 'Science'),
('Literature', NULL),
('Science', NULL),
( 'Satire','Literature'),
( 'Mathematics','Science'),
( 'Science'',Physics');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...