Как я могу удалить строки таблицы, в которой хранятся внешние ключи? - PullRequest
0 голосов
/ 30 мая 2018

РЕШЕНИЕ НИЖЕ

У меня есть три таблицы, подобные следующим:

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, а также чтобы они рассматривались как "собственные поля" (Iне могу объяснить лучше) таблицы, чтобы удалить любую строку таблицы 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"), создайте ONLY ONE FK , который является составным FK, который использует упомянутый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...