mysql - 在同一张表中使用外键

标签 mysql sql

我在名为类别的数据库中创建了一个表:

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 for Programming,我如何将它插入到表中?

最佳答案

你有反向的外键关系。子类别引用类别,所以它应该是:

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

关于mysql - 在同一张表中使用外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56431665/

相关文章:

mysql - 比较查询中的日期时间并在 mysql 中执行删除

php - 在 GoDaddy 托管网站上更新 PHP.ini

python - 使用 SQLAlchemy 执行将 varchar 转换为日期时间时出现问题

sql - MySQL - 我可以组合这 2 个 SQL 语句吗?合并 JOIN 和 AVG?

MySQL 数字运算异常 - 溢出?

php - mysql中如何进行内连接

php - 搜索 3 个表及其相关表的最有效方法是什么?

mysql - 使用 mysql 查询生成针对特定条件重置的序列号

java - 在 neo4j 中模拟 "create view"函数的替代方法是什么?

sql - MYSQL语句语法错误