Вывод монитора InnoDB нечеткий, ограничение внешнего ключа не выполнено - PullRequest
0 голосов
/ 26 октября 2018

У меня есть две таблицы базы данных, 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 в качестве значения по умолчанию, после чего я смог создать внешний ключ без проблем.

1 Ответ

0 голосов
/ 28 октября 2018

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

Невозможно создать внешний ключ для столбца 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, либо обновите эти строки, чтобы изменить значение в столбце внешнего ключа.

...