如何删除存储外键的表的行?

时间:2018-05-30 16:05:10

标签: mysql foreign-keys

解决方案如下

我有三个表如下:

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_techt_arch_layer,也可以将其视为“自己的字段”(为了删除t_arch_layer_tech表的任何行,我无法更好地解释该表?删除t_tech和t_arch_layer表以避免使用外键然后将限制设置为t_arch_layer_tech不是解决方案。

当出现该错误时,检查数据库关系并仔细阅读提供的消息是必要的。它似乎毫无用处,但它帮助我理解了t_arch_layer_tech FK正在发生的事情。我将它们分别用于另一个表 BUT ,而不是复合FK。这是因为我可以在t_arch_layer_tech中插入一些行并仅删除特定的对。

所以,总结一下,如果你要使用一起存在的FK(作为我的对“arch_layer_id,tech_id”),创建 ONLY ONE FK ,这是使用上述的复合FK。

0 个答案:

没有答案