Выходные данные монитора InnoDB неясны, ограничение внешнего ключа не выполняется

У меня есть две таблицы базы данных, InnoDB, в обеих есть столбец id_fornitore, нет возможности создать внешний ключ, и я не понимаю, почему. Это простой внешний ключ, и я успешно создал другой в той же таблице. Вот мой запрос:

ALTER TABLE tbl_prima_nota
ADD CONSTRAINT fk_id_fornitore
FOREIGN KEY (id_fornitore) REFERENCES tbl_fornitori(id_fornitore)
ON DELETE SET NULL
ON UPDATE CASCADE

Вот результат монитора состояния базы данных:

Foreign key constraint fails for table `fatturazione2`.`#sql-68_409`:
,
 CONSTRAINT `fk_id_fornitore` FOREIGN KEY (`id_fornitore`) REFERENCES `tbl_fornitori` (`id_fornitore`) ON DELETE SET NULL ON UPDATE CASCADE
Trying to add in child table, in index fk_id_fornitore tuple:
DATA TUPLE: 2 fields;
0: len 4; hex 80000000; asc     ;;
1: len 4; hex 80000001; asc     ;;

But in parent table `fatturazione2`.`tbl_fornitori`, in index  uk_id_fornitore,
the closest match we can find is record:
PHYSICAL RECORD: n_fields 2; compact format; info bits 0
0: len 4; hex 80000001; asc     ;;
1: len 4; hex 80000001; asc     ;;

Кто-нибудь может понять, что здесь происходит? Большое спасибо.

ОБНОВИТЬ спасибо Билл Карвин за запрос и Рик Джеймс за то, что указали мне в правильном направлении. Проблема заключалась в следующем: когда я впервые добавил столбец id_fornitore в таблицу tbl_prima_nota, я разрешил NULL как возможное значение, но не выбрал его как Default; при создании столбца, поскольку таблица уже была заполнена, MySQL добавил 0 в качестве значения по умолчанию в каждую строку, но 0 отличается от NULL. В качестве быстрого решения, если столбец id_fornitore был пуст, я удалил его из tbl_prima_nota и воссоздал с NULL в качестве значения по умолчанию, после чего я мог без проблем создать внешний ключ.

Убедитесь, что tbl_fornitori (id_fornitore) существует для всех строк в tbl_prima_nota. Думаю, вы обнаружите какие-то нарушения.

Rick James 28.10.2018 02:08

Да, возникла проблема, пожалуйста, прочтите мое обновление

uomopalese 29.10.2018 12:20
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Каждое значение во внешнем ключе дочерней таблицы должно ссылаться на соответствующее значение в первичном или уникальном ключе родительской таблицы.

Вы не можете создать внешний ключ в столбце tbl_prima_nota.id_fornitore, потому что этот столбец содержит некоторые значения, которые отсутствуют в указанном tbl_fornitori.id_fornitore.

Вы можете запросить строки в дочерней таблице, значения внешнего ключа которой отсутствуют в родительской таблице:

SELECT pn.*
FROM tbl_prima_nota AS pn
LEFT OUTER JOIN tbl_fornitori AS f USING (id_fornitore)
WHERE f.id_fornitore IS NULL;

Вы должны либо добавить строки в tbl_fornitori с отсутствующими значениями, либо удалить строки из tbl_prima_nota, либо обновить эти строки, чтобы изменить значение в столбце внешнего ключа.

Другие вопросы по теме