Невозможно вставить в таблицу соединений, даже если обе родительские строки существуют, ограничение внешнего ключа все еще не выполняется - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь вставить строку в таблицу соединений.Таблица соединения настроена так:

CREATE TABLE `attachments_candidates` (
  `candidate_id` int(11) NOT NULL,
  `attachment_id` int(11) NOT NULL,
  PRIMARY KEY (`candidate_id`,`attachment_id`),
  UNIQUE KEY `UNIQ_2FCBAF6C464E68B` (`attachment_id`),
  KEY `IDX_2FCBAF6C91BD8781` (`candidate_id`),
  CONSTRAINT `FK_2FCBAF6C464E68B` FOREIGN KEY (`attachment_id`) REFERENCES `attachment` (`id`),
  CONSTRAINT `FK_2FCBAF6C91BD8781` FOREIGN KEY (`candidate_id`) REFERENCES `candidate` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

Неудачная вставка выглядит следующим образом:

INSERT INTO attachments_candidates (candidate_id, attachment_id) VALUES (70300, 10012);

И отображается следующая ошибка:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db-7`.`attachments_candidates`, CONSTRAINT `FK_2FCBAF6C91BD8781` FOREIGN KEY (`candidate_id`) REFERENCES `candidate` (`id`) ON DELETE CASCADE)

Toубедитесь, что родительские строки существуют (и attachment_id уникальны), я проверил:

MariaDB [db-7]> select count(*) from candidate where id = 70300; select count(*) from attachment where id = 10012; select count(*) from attachments_candidates where attachment_id = 10012;
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: Вот определения таблиц для обеих родительских таблиц (некоторые опущеныполя):

| candidate | CREATE TABLE `candidate` (
  `id` int(11) NOT NULL,
  `resume_id` int(11) DEFAULT NULL,
  `assigned_to_id` int(11) DEFAULT NULL,
  `address_id` int(11) DEFAULT NULL,
  `email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQ_C8B28E44D262AF09` (`resume_id`),
  UNIQUE KEY `UNIQ_C8B28E44F5B7AF75` (`address_id`),
  KEY `IDX_C8B28E44F4BD7827` (`assigned_to_id`),
  CONSTRAINT `FK_C8B28E44BF396750` FOREIGN KEY (`id`) REFERENCES `module_entity` (`id`) ON DELETE CASCADE,
  CONSTRAINT `FK_C8B28E44D262AF09` FOREIGN KEY (`resume_id`) REFERENCES `attachment` (`id`) ON DELETE CASCADE,
  CONSTRAINT `FK_C8B28E44F4BD7827` FOREIGN KEY (`assigned_to_id`) REFERENCES `users` (`id`),
  CONSTRAINT `FK_C8B28E44F5B7AF75` FOREIGN KEY (`address_id`) REFERENCES `address` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

| attachment | CREATE TABLE `attachment` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_by_id` int(11) DEFAULT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `mime_type` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `size` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `extension` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `created_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `IDX_795FD9BBB03A8386` (`created_by_id`),
  CONSTRAINT `FK_795FD9BBB03A8386` FOREIGN KEY (`created_by_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10017 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

MariaDB [db-7]> show triggers;
Empty set (0.05 sec)

Ответы [ 2 ]

0 голосов
/ 19 мая 2019
PRIMARY KEY (`candidate_id`,`attachment_id`),
UNIQUE KEY `UNIQ_2FCBAF6C464E68B` (`attachment_id`),

звучит «неправильно». attachments_candidates пахнет как таблица сопоставления «многие ко многим», но это только много: 1. Но это можно сделать более простым способом - просто добавьте attachment_id в таблицу candidate. (И индексировать его.)

Как только вы исправите эту проблему, ваш Вопрос, вероятно, исчезнет.

0 голосов
/ 02 мая 2019

Абсолютно ничего плохого в том, что вы нам показали;

drop table if exists candidate,attachment,attachments_candidates;

create table candidate(id int primary key);
create table attachment(id int primary key);


CREATE TABLE `attachments_candidates` (
  `candidate_id` int(11) NOT NULL,
  `attachment_id` int(11) NOT NULL,
  PRIMARY KEY (`candidate_id`,`attachment_id`),
  UNIQUE KEY `UNIQ_2FCBAF6C464E68B` (`attachment_id`),
  KEY `IDX_2FCBAF6C91BD8781` (`candidate_id`),
  CONSTRAINT `FK_2FCBAF6C464E68B` FOREIGN KEY (`attachment_id`) REFERENCES `attachment` (`id`),
  CONSTRAINT `FK_2FCBAF6C91BD8781` FOREIGN KEY (`candidate_id`) REFERENCES `candidate` (`id`) ON DELETE CASCADE
) ;

insert into candidate values(70300);
insert into attachment values(10012);

INSERT INTO attachments_candidates (candidate_id, attachment_id) VALUES (70300, 10012);


select * from attachmentS_candidates;


+--------------+---------------+
| candidate_id | attachment_id |
+--------------+---------------+
|        70300 |         10012 |
+--------------+---------------+
1 row in set (0.00 sec)

Пожалуйста, добавьте все определения таблиц И проверьте наличие триггеров.

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