Así que estoy tratando de agregar restricciones de clave externa a mi base de datos como un requisito del proyecto y funcionó la primera o dos veces en tablas diferentes, pero tengo dos tablas en las que obtengo un error al intentar agregar las restricciones de clave externa. El mensaje de error que recibo es:
ERROR 1215 (HY000): no se puede agregar la restricción de clave externa
Este es el SQL que estoy usando para crear las tablas, las dos tablas ofensivas son Patient
y 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;
fuente
set null
eliminar, pero la columna estabanot null
.Había establecido un campo como "Unsigned" y otro no. Una vez que configuré ambas columnas como Unsigned, funcionó.
fuente
Watchout: incluso si sus tablas tienen la misma clasificación, las columnas podrían tener una diferente.
fuente
unique
a la columna de la tabla de referencia a pesar de que es unPrimary Key
!!Intente utilizar el mismo tipo de sus claves principales - int (11) - en las claves externas - smallint (5) - también.
¡Espero eso ayude!
fuente
Confirme que la codificación y clasificación de caracteres para las dos tablas es la misma.
En mi propio caso, una de las tablas estaba usando
utf8
y la otra estaba usandolatin1
.Tuve otro caso donde la codificación era la misma pero la intercalación diferente. Uno
utf8_general_ci
el otroutf8_unicode_ci
Puede ejecutar este comando para establecer la codificación y la clasificación para una tabla.
Espero que esto ayude a alguien.
fuente
Para establecer una CLAVE EXTRANJERA en la Tabla B, debe establecer una CLAVE en la tabla A.
En la tabla A: ÍNDICE
id
(id
)Y luego en la tabla B,
fuente
Tuve el mismo problema y la solución fue muy simple. Solución: las claves externas declaradas en la tabla no deben establecerse como no nulas.
referencia: si especifica una acción SET NULL, asegúrese de no haber declarado las columnas en la tabla secundaria como NOT NULL. ( ref )
fuente
Verifique las siguientes reglas:
Primero verifica si los nombres se dan correctamente para los nombres de tabla
Segundo tipo de datos correcto dar a la clave externa?
fuente
Asegúrese de que ambas tablas estén en formato InnoDB. Incluso si uno está en formato MyISAM, entonces, la restricción de clave externa no funcionará.
Además, otra cosa es que ambos campos deben ser del mismo tipo. Si uno es INT, entonces el otro también debería ser INT. Si uno es VARCHAR, el otro también debe ser VARCHAR, etc.
fuente
Enfrenté el problema y pude resolverlo asegurándome de que los tipos de datos coincidieran exactamente.
Estaba usando SequelPro para agregar la restricción y estaba haciendo que la clave primaria no estuviera firmada por defecto.
fuente
Verifique la firma en ambas columnas de su tabla. Si la columna de la tabla de referencia está FIRMADA, la columna de la tabla de referencia también debe FIRMARSE.
fuente
Para mí, el problema era que mi tabla principal tenía un conjunto de caracteres diferente al del que estaba creando.
Tabla principal (PRODUCTOS)
Tabla secundaria que tuvo un problema (PRICE_LOGS)
MODIFICADO A
fuente
¡Mi problema era que estaba tratando de crear la tabla de relaciones antes que otras tablas!
fuente
SET foreign_key_checks = 0;
Tuve un error similar al crear una clave foránea en una tabla Many to Many donde la clave primaria constaba de 2 claves foráneas y otra columna normal. Solucioné el problema corrigiendo el nombre de la tabla referenciada, es decir, la compañía, como se muestra en el código corregido a continuación:
fuente
¡Tuve un error similar con dos claves foráneas para tablas diferentes pero con los mismos nombres de clave! Cambié el nombre de las teclas y el error desapareció)
fuente
Tuve un error similar, pero en mi caso no pude declarar el pk como auto_increment.
Por si acaso podría ser útil para cualquiera
fuente
Tengo el mismo error. La causa en mi caso fue:
La causa fue: dado que usé phpmyadmin para crear algunas claves externas en la base de datos renombrada, las claves externas se crearon con un prefijo de nombre de base de datos pero el prefijo de nombre de base de datos no se actualizó. Así que todavía había referencias en la copia de seguridad-db que apuntaban a la nueva base de datos creada.
fuente
Mi solución es quizás un poco vergonzosa y cuenta la historia de por qué a veces debes mirar lo que tienes frente a ti en lugar de estas publicaciones :)
Había dirigido a un ingeniero de avanzada antes, lo que falló, por lo que eso significaba que mi base de datos ya tenía algunas tablas, luego he estado sentado tratando de corregir fallas de restricciones de claves externas tratando de asegurarme de que todo fuera perfecto, pero funcionó contra el tablas creadas previamente, por lo que no prevalecerá.
fuente
Una causa adicional de este error es cuando sus tablas o columnas contienen palabras clave reservadas :
A veces uno olvida estos.
fuente
En mi caso, hubo un error de sintaxis que la consola MySQL no notificó explícitamente al ejecutar la consulta. Sin embargo,
SHOW ENGINE INNODB STATUS
laLATEST FOREIGN KEY ERROR
sección del comando informó:Tuve que dejar un espacio en blanco entre
REFERENCES
yrole
hacer que funcione.fuente
Para mí lo fue: no puede omitir el prefijo de la tabla de base de datos actual si crea un FK para una base de datos no actual que hace referencia a la base de datos actual:
Si omito "currrent_db". para la tabla de usuarios, me sale el error FK. Interesante que SHOW ENGINE INNODB STATUS; No muestra nada en este caso.
fuente
Tuve este mismo problema, luego corregí el nombre del motor como Innodb en las tablas padre e hijo y corrigí el nombre del campo de referencia
c_id
REFERENCIAS DE LLAVE EXTRANJERAx9o_parent_table
(c_id
),luego funciona bien y las tablas se instalan correctamente. Esto se utilizará por completo para alguien.
fuente