Поэтому я пытаюсь добавить ограничения внешнего ключа в свою базу данных в качестве требования проекта, и это сработало в первый или два раза для разных таблиц, но у меня есть две таблицы, в которых я получаю сообщение об ошибке при попытке добавить ограничения внешнего ключа. Я получаю сообщение об ошибке:
ОШИБКА 1215 (HY000): невозможно добавить ограничение внешнего ключа
Это SQL , я использую для создания таблиц, два оскорбляющих таблиц Patient
и Appointment
.
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
CREATE SCHEMA IF NOT EXISTS `doctorsoffice` DEFAULT CHARACTER SET utf8 ;
USE `doctorsoffice` ;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`doctor`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`doctor` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`doctor` (
`DoctorID` INT(11) NOT NULL AUTO_INCREMENT ,
`FName` VARCHAR(20) NULL DEFAULT NULL ,
`LName` VARCHAR(20) NULL DEFAULT NULL ,
`Gender` VARCHAR(1) NULL DEFAULT NULL ,
`Specialty` VARCHAR(40) NOT NULL DEFAULT 'General Practitioner' ,
UNIQUE INDEX `DoctorID` (`DoctorID` ASC) ,
PRIMARY KEY (`DoctorID`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`medicalhistory`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`medicalhistory` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`medicalhistory` (
`MedicalHistoryID` INT(11) NOT NULL AUTO_INCREMENT ,
`Allergies` TEXT NULL DEFAULT NULL ,
`Medications` TEXT NULL DEFAULT NULL ,
`ExistingConditions` TEXT NULL DEFAULT NULL ,
`Misc` TEXT NULL DEFAULT NULL ,
UNIQUE INDEX `MedicalHistoryID` (`MedicalHistoryID` ASC) ,
PRIMARY KEY (`MedicalHistoryID`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`Patient`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`Patient` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`Patient` (
`PatientID` INT unsigned NOT NULL AUTO_INCREMENT ,
`FName` VARCHAR(30) NULL ,
`LName` VARCHAR(45) NULL ,
`Gender` CHAR NULL ,
`DOB` DATE NULL ,
`SSN` DOUBLE NULL ,
`MedicalHistory` smallint(5) unsigned NOT NULL,
`PrimaryPhysician` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`PatientID`) ,
UNIQUE INDEX `PatientID_UNIQUE` (`PatientID` ASC) ,
CONSTRAINT `FK_MedicalHistory`
FOREIGN KEY (`MEdicalHistory` )
REFERENCES `doctorsoffice`.`medicalhistory` (`MedicalHistoryID` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FK_PrimaryPhysician`
FOREIGN KEY (`PrimaryPhysician` )
REFERENCES `doctorsoffice`.`doctor` (`DoctorID` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`Appointment`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`Appointment` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`Appointment` (
`AppointmentID` smallint(5) unsigned NOT NULL AUTO_INCREMENT ,
`Date` DATE NULL ,
`Time` TIME NULL ,
`Patient` smallint(5) unsigned NOT NULL,
`Doctor` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`AppointmentID`) ,
UNIQUE INDEX `AppointmentID_UNIQUE` (`AppointmentID` ASC) ,
CONSTRAINT `FK_Patient`
FOREIGN KEY (`Patient` )
REFERENCES `doctorsoffice`.`Patient` (`PatientID` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FK_Doctor`
FOREIGN KEY (`Doctor` )
REFERENCES `doctorsoffice`.`doctor` (`DoctorID` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`InsuranceCompany`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`InsuranceCompany` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`InsuranceCompany` (
`InsuranceID` smallint(5) NOT NULL AUTO_INCREMENT ,
`Name` VARCHAR(50) NULL ,
`Phone` DOUBLE NULL ,
PRIMARY KEY (`InsuranceID`) ,
UNIQUE INDEX `InsuranceID_UNIQUE` (`InsuranceID` ASC) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`PatientInsurance`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`PatientInsurance` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`PatientInsurance` (
`PolicyHolder` smallint(5) NOT NULL ,
`InsuranceCompany` smallint(5) NOT NULL ,
`CoPay` INT NOT NULL DEFAULT 5 ,
`PolicyNumber` smallint(5) NOT NULL AUTO_INCREMENT ,
PRIMARY KEY (`PolicyNumber`) ,
UNIQUE INDEX `PolicyNumber_UNIQUE` (`PolicyNumber` ASC) ,
CONSTRAINT `FK_PolicyHolder`
FOREIGN KEY (`PolicyHolder` )
REFERENCES `doctorsoffice`.`Patient` (`PatientID` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FK_InsuranceCompany`
FOREIGN KEY (`InsuranceCompany` )
REFERENCES `doctorsoffice`.`InsuranceCompany` (`InsuranceID` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
USE `doctorsoffice` ;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
источник
set null
удалить, но столбец былnot null
.Я установил одно поле как «Без знака», а другое - нет. Как только я установил для обоих столбцов значение Без знака, это сработало.
источник
Watchout: даже если у ваших таблиц одинаковые параметры сортировки, столбцы могут иметь разные значения.
источник
unique
в столбец справочной таблицы, хотя этоPrimary Key
!!Попробуйте использовать тот же тип ваших первичных ключей - int (11) - для внешних ключей - smallint (5) - также.
Надеюсь, поможет!
источник
Убедитесь, что кодировка и сопоставление символов для двух таблиц одинаковы.
В моем собственном случае одна из таблиц использовала,
utf8
а другая использовалаlatin1
.У меня был другой случай, когда кодировка была такой же, но сопоставление отличалось. Один
utf8_general_ci
другойutf8_unicode_ci
Вы можете запустить эту команду, чтобы установить кодировку и параметры сортировки для таблицы.
Я надеюсь, что это поможет кому-то.
источник
Чтобы установить ИНОСТРАННЫЙ КЛЮЧ в таблице B, вы должны установить КЛЮЧ в таблице A.
В таблице A: ИНДЕКС
id
(id
)А затем в таблице B,
источник
У меня была та же проблема, и решение было очень простым. Решение: внешние ключи, объявленные в таблице, не должны быть ненулевыми.
ссылка: Если вы указываете действие SET NULL, убедитесь, что вы не объявили столбцы в дочерней таблице как NOT NULL. ( ссылка )
источник
Проверьте следующие правила:
Сначала проверяется, правильно ли указаны имена для имен таблиц.
Второй правильный тип данных дать внешнему ключу?
источник
Пожалуйста, убедитесь, что обе таблицы в формате InnoDB. Даже если вы используете формат MyISAM, ограничение внешнего ключа работать не будет.
Кроме того, другое дело, что оба поля должны быть одного типа. Если один - INT, то другой также должен быть INT. Если один из них VARCHAR, другой также должен быть VARCHAR и т. Д.
источник
Я столкнулся с проблемой и смог ее решить, убедившись, что типы данных точно совпадают.
Я использовал SequelPro для добавления ограничения, и по умолчанию первичный ключ делался неподписанным.
источник
Проверьте подпись в обеих колонках таблицы. Если столбец ссылающейся таблицы имеет значение SIGNED, столбец ссылочной таблицы также должен быть SIGNED.
источник
Для меня проблема была в том, что в моей родительской таблице был другой набор символов, чем тот, который я создавал.
Родительский стол (ПРОДУКТЫ)
Детская таблица, в которой возникла проблема (PRICE_LOGS)
ИЗМЕНЕНО ДЛЯ
источник
Моя проблема заключалась в том, что я пытался создать таблицу отношений перед другими таблицами!
источник
SET foreign_key_checks = 0;
У меня была похожая ошибка при создании внешнего ключа в таблице «многие ко многим», где первичный ключ состоял из 2 внешних ключей и другого обычного столбца. Я исправил проблему, исправив имя таблицы, на которую указывает ссылка, т.е. компанию, как показано в исправленном коде ниже:
источник
У меня была похожая ошибка с двумя внешними ключами для разных таблиц, но с одинаковыми именами ключей! Я переименовал ключи и ошибка ушла)
источник
Была похожая ошибка, но в моем случае я пропустил объявление pk как auto_increment.
На всякий случай это может быть полезно любому
источник
Я получил ту же ошибку. Причина в моем случае была:
Причина была следующей: поскольку я использовал phpmyadmin для создания некоторых внешних ключей в переименованной базе данных - внешние ключи создавались с префиксом имени базы данных, но префикс имени базы данных не обновлялся. Таким образом, в резервной базе данных все еще были ссылки, указывающие на вновь созданную базу данных.
источник
Мое решение, может быть, немного смущает и рассказывает историю о том, почему вы иногда должны смотреть на то, что у вас есть, вместо этих сообщений :)
Раньше я работал с форвард-инженером, который потерпел неудачу, так что это означало, что в моей базе данных уже было несколько таблиц, затем я сидел, пытаясь исправить ошибки, связанные с несовпадением внешних ключей, пытаясь убедиться, что все было идеально, но это столкнулось с Таблицы созданы ранее, поэтому не было преобладать.
источник
Еще одна причина этой ошибки - когда ваши таблицы или столбцы содержат зарезервированные ключевые слова :
Иногда это забывают.
источник
В моем случае была синтаксическая ошибка, которая не была явно уведомлена консолью MySQL при выполнении запроса. Однако,
SHOW ENGINE INNODB STATUS
командованияLATEST FOREIGN KEY ERROR
сообщил раздел,Мне пришлось оставить пробел между ними
REFERENCES
иrole
заставить его работать.источник
Для меня это было - вы не можете опустить префикс текущей таблицы БД, если вы создаете FK для не текущей БД, ссылающейся на текущую БД:
Если я опущу "currrent_db." для таблицы пользователей я получаю ошибку FK. Интересно, что ПОКАЗАТЬ ДВИГАТЕЛЬ INNODB STATUS; ничего не показывает в этом случае.
источник
У меня была такая же проблема, затем я исправил имя Engine как Innodb в родительской и дочерней таблицах и исправил имя ссылочного поля FOREIGN KEY (
c_id
) REFERENCESx9o_parent_table
(c_id
),затем оно работает нормально, и таблицы установлены правильно. Это будет полное использование для кого-то.
источник