Pergunta

Eu criei um modelo com MySQL Workbench e agora estou tentando instalar-lo para um mysql servidor.

Usando File> Export> Encaminhar Engenheiro SQL Criar script ... ele gera um arquivo grande agradável para mim, com todas as configurações que eu pedir. I passar a MySQL GUI Tools (o Query Browser especificamente) e carga -se este script (note que eu vou forma uma ferramenta MySQL oficial para outro). No entanto, quando tento realmente executar esse arquivo, eu recebo o mesmo erro repetidamente

SQLSTATE [HY000]: Erro geral: 1005 Não é possível criar tabela './Srs_dev/location.frm' (errno: 150)

"OK", eu digo para mim mesmo, algo está errado com o quadro de localização. Então eu verificar a definição no arquivo de saída.

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) ;

Looks ok para mim. I supor que talvez algo está errado com o Query Browser, então eu colocar este arquivo no servidor e tentar carregá-lo desta maneira

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

E eu recebo o mesmo erro. Então eu começo a Google esta questão e encontrar todos os tipos de contas que falar sobre um erro com tabelas de estilo InnoDB que falham com chaves estrangeiras, e a correção é adicionar "set FOREIGN_KEY_CHECKS = 0;" para o script SQL. Bem, como você pode ver, que já é parte do arquivo que o MySQL Workbench cuspiu.

Então, minha pergunta é, então, por que não é esse trabalho quando eu estou fazendo o que eu acho que eu deveria estar fazendo?

Version Info:

  • MySQL: 5.0.45

  • GUI Tools: 1.2.17
  • Workbench: 5.0.30
Foi útil?

Solução

O tipo de campo em uma chave externa deve ser o mesmo que o tipo da coluna que está fazendo referência. Você tem as seguintes (cortando):

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 ,

para que você está tentando se referir a campos INT (em mesas state e brand) com campos TINYINT em location mesa. Eu acho que é o erro que está reclamando. Não tenho certeza como ele surgiu, em primeiro lugar, ou porque zerar FOREIGN_KEY_CHECKS não pára MySQL de diagnosticar o erro, mas o que acontece se você corrigir esse tipo de incompatibilidade?

Outras dicas

Para outros olhando para esta discussão, há uma série de razões que você pode obter este erro:

Veja o seguinte link para uma lista completa para errno 150, errno 121 e outros erros MySQL chave estrangeira:

MySQL Errors chave estrangeira e Errno 150

A resposta de @juacala apenas verificado

. Mas não me ajudou. Aqui é a mensagem que enviei @ELIACOM quando eu encontrei a minha fonte de problemas:.

Eu estava lendo esta grande fonte de soluções, mas a minha questão não é destinatária. Eu estava tentando adicionar uma FK em uma apontar tabela InnoDB a um PK em uma MyISAM. Depois de definir o MyISAM para InnoDB funcionou. Eu verificada a sua lista inteira antes de perceber isso. Felicidades.

Eu tive mesmo problema. De alguma forma eu não percebi a valor auto_increment definido para o ID da tabela. Talvez ele ajuda a alguém.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top