tabla solucion puedo incorrectly hy000 formed foreign error create crear constraint mysql foreign-keys innodb mysql-error-1005

solucion - MySQL: Creando tabla con error FK(errno 150)



error 150 foreign key constraint is incorrectly formed (4)

Acabo de comprobar la respuesta de @juacala. Pero no me ayudó. Aquí está el mensaje que envié a @ELIACOM cuando encontré mi fuente de problemas:

Estaba leyendo esta gran fuente de soluciones, pero mi problema no está resuelto. Estaba intentando agregar un FK en una tabla INNODB que apunta a un PK en un MyISAM. Después de configurar el MyIsam a INNODB funcionó. Revisé toda tu lista antes de darme cuenta de eso. Aclamaciones.

He creado un modelo con MySQL Workbench y ahora estoy intentando instalarlo en un servidor mysql.

Usando Archivo> Exportar> Forward Engineer SQL CREATE Script ... genera un archivo grande para mí, con todos los ajustes que solicito. Cambio a las herramientas de GUI de MySQL (específicamente al buscador de consultas) y cargo este script (tenga en cuenta que voy de una herramienta de MySQL oficial a otra). Sin embargo, cuando intento ejecutar este archivo, recibo el mismo error una y otra vez

SQLSTATE [HY000]: Error general: 1005 No se puede crear la tabla ''./srs_dev/location.frm'' (errno: 150)

"OK", me digo a mí mismo, algo está mal con la tabla de ubicación. Así que reviso la definición en el archivo de salida.

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=''TRADITIONAL''; -- ----------------------------------------------------- -- Table `state` -- ----------------------------------------------------- DROP TABLE IF EXISTS `state` ; CREATE TABLE IF NOT EXISTS `state` ( `state_id` INT NOT NULL AUTO_INCREMENT , `iso_3166_2_code` VARCHAR(2) NOT NULL , `name` VARCHAR(60) NOT NULL , PRIMARY KEY (`state_id`) ) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `brand` -- ----------------------------------------------------- DROP TABLE IF EXISTS `brand` ; CREATE TABLE IF NOT EXISTS `brand` ( `brand_id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `name` VARCHAR(45) NOT NULL , `domain` VARCHAR(45) NOT NULL , `manager_name` VARCHAR(100) NULL , `manager_email` VARCHAR(255) NULL , PRIMARY KEY (`brand_id`) ) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `location` -- ----------------------------------------------------- DROP TABLE IF EXISTS `location` ; CREATE TABLE IF NOT EXISTS `location` ( `location_id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `name` VARCHAR(255) NOT NULL , `address_line_1` VARCHAR(255) NULL , `address_line_2` VARCHAR(255) NULL , `city` VARCHAR(100) NULL , `state_id` TINYINT UNSIGNED NULL DEFAULT NULL , `postal_code` VARCHAR(10) NULL , `phone_number` VARCHAR(20) NULL , `fax_number` VARCHAR(20) NULL , `lat` DECIMAL(9,6) NOT NULL , `lng` DECIMAL(9,6) NOT NULL , `contact_url` VARCHAR(255) NULL , `brand_id` TINYINT UNSIGNED NOT NULL , `summer_hours` VARCHAR(255) NULL , `winter_hours` VARCHAR(255) NULL , `after_hours_emergency` VARCHAR(255) NULL , `image_file_name` VARCHAR(100) NULL , `manager_name` VARCHAR(100) NULL , `manager_email` VARCHAR(255) NULL , `created_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , PRIMARY KEY (`location_id`) , CONSTRAINT `fk_location_state` FOREIGN KEY (`state_id` ) REFERENCES `state` (`state_id` ) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_location_brand` FOREIGN KEY (`brand_id` ) REFERENCES `brand` (`brand_id` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; CREATE INDEX `fk_location_state` ON `location` (`state_id` ASC) ; CREATE INDEX `fk_location_brand` ON `location` (`brand_id` ASC) ; CREATE INDEX `idx_lat` ON `location` (`lat` ASC) ; CREATE INDEX `idx_lng` ON `location` (`lng` ASC) ;

Me parece bien Supongo que tal vez haya algún problema con el navegador de consultas, así que coloco este archivo en el servidor e intento cargarlo de esta manera

] mysql -u admin -p -D dbname < path/to/create_file.sql

Y me sale el mismo error. Así que empiezo a buscar en Google este problema y encuentro todo tipo de cuentas que hablan de un error con tablas de estilo InnoDB que fallan con claves externas, y la solución es agregar "SET FOREIGN_KEY_CHECKS = 0;" a la secuencia de comandos SQL. Bueno, como puedes ver, eso ya es parte del archivo que MySQL Workbench escupió.

Entonces, mi pregunta es, ¿por qué no funciona esto cuando hago lo que creo que debo hacer?

Información de la versión:

  • MySQL: 5.0.45

  • Herramientas GUI: 1.2.17
  • Banco de trabajo: 5.0.30

El tipo de campo en una clave externa debe ser el mismo que el tipo de la columna a la que hacen referencia. Tienes los siguientes (recortes):

CREATE TABLE IF NOT EXISTS `state` ( `state_id` INT NOT NULL AUTO_INCREMENT , ... CREATE TABLE IF NOT EXISTS `brand` ( `brand_id` INT UNSIGNED NOT NULL AUTO_INCREMENT , ... CREATE TABLE IF NOT EXISTS `location` ( ... `state_id` TINYINT UNSIGNED NULL DEFAULT NULL , ... `brand_id` TINYINT UNSIGNED NOT NULL ,

por lo que está intentando referirse a los campos INT (en state tablas y brand ) con los campos TINYINT en la location tabla. Creo que ese es el error del que se está quejando. No estoy seguro de cómo surgió en primer lugar, o por qué la reducción a cero de FOREIGN_KEY_CHECKS no impide que MySQL diagnostique el error, pero ¿qué sucede si solucionas esta falta de coincidencia de tipo?


Para otros que miran este hilo, hay MUCHAS razones por las que puede obtener este error:

Consulte el siguiente enlace para obtener una lista completa de errno 150, errno 121 y otros errores de clave foránea de MySQL:

Errores de clave foránea de MySQL y Errno 150


Tuve el mismo problema. De alguna manera no me di cuenta de establecer el valor auto_increment en la identificación de la tabla. Tal vez ayuda a alguien.