У меня есть две таблицы базы данных, 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_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
, либо обновить эти строки, чтобы изменить значение в столбце внешнего ключа.
Убедитесь, что tbl_fornitori (id_fornitore) существует для всех строк в tbl_prima_nota. Думаю, вы обнаружите какие-то нарушения.