mysql - 如何删除存储外键的表的行?
问题描述
解决方案如下
我有如下三个表:
CREATE TABLE `t_arch_layer` (
`arch_layer_id` int(11) NOT NULL AUTO_INCREMENT,
`arch_layer_name` varchar(45) NOT NULL,
PRIMARY KEY (`arch_layer_id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
CREATE TABLE `t_tech` (
`tech_id` int(11) NOT NULL AUTO_INCREMENT,
`tech_name` varchar(45) DEFAULT NULL,
`tech_type_id` int(11) NOT NULL,
`tech_icon` text,
PRIMARY KEY (`tech_id`),
KEY `fk_t_tech_t_tech_type1_idx` (`tech_type_id`),
CONSTRAINT `fk_t_tech_t_tech_type1` FOREIGN KEY (`tech_type_id`) REFERENCES `t_tech_type` (`tech_type_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8;
CREATE TABLE `t_arch_layer_tech` (
`arch_layer_id` int(11) NOT NULL,
`tech_id` int(11) NOT NULL,
PRIMARY KEY (`tech_id`,`arch_layer_id`),
KEY `fk_t_layer_has_t_tech_t_tech1_idx` (`tech_id`),
KEY `fk_t_layer_has_t_tech_t_layer1_idx` (`arch_layer_id`),
CONSTRAINT `fk_t_layer_has_t_tech_t_layer1` FOREIGN KEY (`arch_layer_id`) REFERENCES `t_arch_layer` (`arch_layer_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_t_layer_has_t_tech_t_tech1` FOREIGN KEY (`tech_id`) REFERENCES `t_tech` (`tech_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
基本上这是一种典型情况,其中一个表使用来自另外两个不同表的两个外键。该表存储了层和技术之间可能的组合,因此它不能存储 layer_id 和 tech_id 两者都不存在的任何组合。
但是有一个问题,每当我想要从t_arch_layer_tech
. 由于外键,这是不可能的,我知道。
我的问题是,是否有一些东西可以使用外键作为参考来禁止插入不存在的值,t_tech
或者t_arch_layer
也被视为表的“自己的字段”(我无法更好地解释),以便删除t_arch_layer_tech
表格的任何一行?删除 t_tech 和 t_arch_layer 表以避免外键,然后将限制设置到 t_arch_layer_tech 不是解决方案。
解决方案
当出现该错误时,需要检查数据库关系并仔细阅读提供的消息。这似乎没用,但它帮助我了解t_arch_layer_tech
FK 发生了什么。我将它们单独使用到另一个表中,而不是作为复合 FK。这就是原因,因为我可以将一些行插入t_arch_layer_tech
并只删除特定的对。
因此,总而言之,如果您要使用一起存在的 FK(如我的一对“arch_layer_id,tech_id”),则只创建一个 FK,它是使用上述方法的复合 FK。
解决方案
推荐阅读
- python - 表单提交在带有 python 2.7 的 Django 1.11 中不起作用
- r - 如何从 2 个向量返回多个名称
- input - 如何将 Fontawesome 图标放在输入“值”字段中?
- lua - 从 Roblox studio 上的服务器启动本地脚本
- canvas - 三.js如何输出到现有画布
- excel - 用下面的值填写 VBA
- c# - oAuth 2.0 请求令牌时抛出 401
- java - 使用 CriteriaQuery 调用 oracle 方法 add_months
- javascript - 如果提供的选择不是石头、纸、剪刀,如何添加错误警报?如何使整个代码更短?
- php - AJAX/PHP Uncaught ReferenceError: data is not defined