Pregunta

He creado un modelo con MySQL Workbench y ahora estoy tratando de instalarlo en un MySQL servidor.

Con Archivo> Exportar> Reenviar SQL Ingeniero crear un script ... se genera un archivo grande y bonita para mí, con todos los ajustes que pido. Me cambio a MySQL GUI Tools (el Query Browser específicamente) y la carga hasta este script (tenga en cuenta que voy forma de la herramienta oficial de MySQL a otra). Sin embargo, cuando intento ejecutar realidad este archivo, me sale el mismo error una y otra

  

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

"OK", me digo, algo está mal en la tabla de ubicación. Así que echa un vistazo a la definición contenida 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) ;

Se ve bien para mí. Conjeturo que tal vez algo está mal en el Query Browser, por lo que poner este archivo en el servidor y intento cargar esta manera

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

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

Por lo tanto, mi pregunta es entonces, ¿por qué esto no está trabajando cuando estoy haciendo lo que creo que se supone que estoy haciendo?

Información de la versión:

  • MySQL: 5.0.45

  • Herramientas Visuales: 1.2.17
  • Workbench: 5.0.30
¿Fue útil?

Solución

El tipo del campo en una clave externa debe ser el mismo que el tipo de la columna que se está haciendo referencia. Usted tiene los siguientes (que corta con tijeras):

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 estamos tratando de hacer referencia a INT campos (en los cuadros state y brand) con los campos TINYINT en location mesa. Creo que ese es el error que se queja. No está seguro de cómo llegó en primer lugar, o por qué poniendo a cero FOREIGN_KEY_CHECKS no deja de MySQL desde el diagnóstico del error, pero lo que sucede si se fija este tipo desajuste?

Otros consejos

Para otros mirando este hilo, hay una gran cantidad de razones por las que usted puede conseguir este error:

Vea el siguiente enlace para obtener una lista completa de errno 150, errno 121 y otros errores clave MySQL Exteriores:

MySQL errores clave Exteriores y Errno 150

acaba de comprobar la respuesta @juacala 's. Pero no me ayuda. Este es el mensaje que envié @ELIACOM cuando encontré mi fuente de problemas:.

  

Yo estaba leyendo esta gran fuente de soluciones, pero mi problema no se   adressed. Yo estaba tratando de añadir una FK en una mesa que apunta a un INNODB   PK en un MyISAM. Después de ajustar el MyISAM a InnoDB funcionó. yo   comprobado su lista entera antes de darse cuenta de eso. Saludos.

tuve misma edición. De alguna manera no me di cuenta para fijar el valor AUTO_INCREMENT a la ID de la tabla. Tal vez ayude a alguien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top