У вас есть отношение внешнего ключа в обратном направлении.Подкатегории ссылаются на категории, поэтому должно быть:
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');