Это правила. Хотя это не совсем так. Вы можете определить внутренние классы внутри вашего «основного» класса следующим образом:
public class A {public class B {...}}
Чтобы найти конкретную ошибку, запустите это:
SHOW ENGINE INNODB STATUS;
И посмотрите в разделе LATEST FOREIGN KEY ERROR
.
Тип данных для дочернего столбца должен точно соответствовать родительскому столбцу , Например, поскольку medicalhistory.MedicalHistoryID
является INT
, Patient.MedicalHistory
также должен быть INT
, а не SMALLINT
.
Кроме того, перед запуском запроса set foreign_key_checks=0
DDL, чтобы вы могли создавать таблицы в произвольном порядке, а не создавать все родительские таблицы перед соответствующими дочерними таблицами.
unique
в столбец ссылочной таблицы, даже если это Primary Key
!!
– Yahya
14 November 2017 в 12:18
Попробуйте использовать тот же тип ваших первичных ключей - int (11) - на внешних ключах - smallint (5) - также.
Надеюсь, это поможет!
Я установил одно поле как «Без знака», а другое - нет. Как только я установил оба столбца в Unsigned, он работал.
Еще одна причина этой ошибки заключается в том, что ваши таблицы или столбцы содержат зарезервированные ключевые слова :
Иногда это забывается.
Проверить следующие правила:
Мое решение, может быть, немного смущает и рассказывает историю о том, почему вы должны иногда смотреть на то, что у вас есть перед вами, а не на эти сообщения :)
Раньше я работал перед инженером, не удалось, так что это означало, что в моей базе данных уже было несколько таблиц, а затем я сидел, пытаясь исправить ошибки внешних ключей, пытаясь убедиться, что все было идеально, но оно столкнулось с ранее созданными таблицами, поэтому не было преимущественную силу.
Убедитесь, что кодировка символов и сопоставление для двух таблиц одинаковы.
В моем случае одна из таблиц использовала utf8
, а другая - latin1
.
У меня был другой случай, когда кодировка была одинаковой, но сортировка различна. Один utf8_general_ci
другой utf8_unicode_ci
Вы можете запустить эту команду, чтобы установить кодировку и сопоставление для таблицы.
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Надеюсь, это поможет кому-то.
У меня была аналогичная ошибка при создании внешнего ключа в таблице Many to Many, где первичный ключ состоял из 2 внешних ключей и другого нормального столбца. Я исправил проблему, исправляя имя таблицы ссылок, т. Е. Компанию, как показано в скорректированном коде ниже:
create table company_life_cycle__history -- (M-M)
(
company_life_cycle_id tinyint unsigned not null,
Foreign Key (company_life_cycle_id) references company_life_cycle(id) ON DELETE CASCADE ON UPDATE CASCADE,
company_id MEDIUMINT unsigned not null,
Foreign Key (company_id) references company(id) ON DELETE CASCADE ON UPDATE CASCADE,
activity_on date NOT NULL,
PRIMARY KEY pk_company_life_cycle_history (company_life_cycle_id, company_id,activity_on),
created_on datetime DEFAULT NULL,
updated_on datetime DEFAULT NULL,
created_by varchar(50) DEFAULT NULL,
updated_by varchar(50) DEFAULT NULL
);
Проверьте подпись на обоих столбцах таблицы. Если столбец ссылочной таблицы SIGNED, столбец таблицы ссылок также должен быть SIGNED.
Я столкнулся с проблемой и смог ее решить, убедившись, что типы данных точно совпадают.
Я использовал SequelPro для добавления ограничения, и он делал первичный ключ как неподписанный по умолчанию ,
У меня такая же ошибка. Причина в моем случае:
Причина была: поскольку я использовал phpmyadmin для создания некоторых внешних ключей в переименованной базе данных - внешние ключи, созданные с префиксным именем базы данных, но имя базы данных префикс не был обновлен. Таким образом, в резервной копии db все еще есть ссылки на вновь созданный db.
Имел подобную ошибку, но в моем случае мне не хватало, чтобы объявить pk как auto_increment.
На всякий случай это может быть полезно любому
У меня была такая же проблема, и решение было очень простым. Решение: внешние ключи, объявленные в таблице, не должны быть не равными нулю.
Ссылка: Если вы укажете действие SET NULL, убедитесь, что вы не объявили столбцы в дочерней таблице как NOT NULL. ( ref )
У меня была эта же проблема, после чего я исправил имя Engine как Innodb как в родительских, так и в дочерних таблицах и скорректировал имя ссылочного поля FOREIGN KEY (c_id
) ССЫЛКИ x9o_parent_table
(c_id
), тогда он отлично работает, и таблицы установлены правильно. Это будет полезно для кого-то.
Чтобы установить FOREIGN KEY в таблице B, вы должны установить KEY в таблице A.
В таблице A: INDEX id
(id
)
И затем в таблице B,
CONSTRAINT `FK_id` FOREIGN KEY (`id`) REFERENCES `table-A` (`id`)
Убедитесь, что обе таблицы находятся в формате InnoDB. Даже если он находится в формате MyISAM, тогда ограничение внешнего ключа не будет работать.
Кроме того, другое дело, что оба поля должны быть одного типа. Если один из них INT, то другой должен также быть INT. Если один из VARCHAR, другой должен также быть VARCHAR и т. Д.
У меня была аналогичная ошибка с двумя внешними ключами для разных таблиц, но с одинаковыми именами клавиш! Я переименовал ключи, и ошибка исчезла)
set null
удалить, но столбец былnot null
. – Matt 5 March 2017 в 05:58