Mysql key creation error

Asked

Viewed 84 times

0

I’m making the following mistake:

Error Code: 1005. Can’t create table bravo.tb_gerenciador (Rrno: 150 "Foreign key Constraint is incorrectly Formed")

follows the script:

-- MySQL Script generated by MySQL Workbench
-- Wed Apr 26 12:35:57 2017
-- Model: New Model    Version: 1.0
-- MySQL Workbench Forward Engineering

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,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema Bravo
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema Bravo
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `Bravo` DEFAULT CHARACTER SET latin1 ;
USE `Bravo` ;

-- -----------------------------------------------------
-- Table `Bravo`.`fornecedor`
-- -----------------------------------------------------


CREATE TABLE IF NOT EXISTS `Bravo`.`tb_fornecedor` (
  `idFornecedor` INT(11) NOT NULL AUTO_INCREMENT,
  `nomeFornecedor` VARCHAR(50) NOT NULL,
  `cnpjFornecedor` VARCHAR(45) NOT NULL,
  `contatoFornecedor` VARCHAR(45) NULL DEFAULT NULL,
  PRIMARY KEY (`idFornecedor`),
  UNIQUE INDEX `cnpjFornecedor_UNIQUE` (`cnpjFornecedor` ASC))
  ENGINE = InnoDB
  AUTO_INCREMENT = 18
  DEFAULT CHARACTER SET = latin1;

CREATE TABLE IF NOT EXISTS `Bravo`.`tb_caminhao` (
  `idCaminhao` INT(11) NOT NULL AUTO_INCREMENT,
  `placaCaminhao` VARCHAR(8) NOT NULL,
  `modeloCaminhao` VARCHAR(45) NOT NULL,
  `pesoFinalCaminhao` VARCHAR(45) NOT NULL,
  `pesoInicialCaminhao` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`idCaminhao`),
  UNIQUE INDEX `placa_UNIQUE` (`placaCaminhao` ASC))
  ENGINE = InnoDB
  AUTO_INCREMENT = 18
  DEFAULT CHARACTER SET = latin1;

CREATE TABLE IF NOT EXISTS `Bravo`.`tb_motorista` (
  `idMotorista` INT(11) NOT NULL AUTO_INCREMENT,
  `nomeMotorista` VARCHAR(45) NOT NULL,
  `cnhMotorista` VARCHAR(15) NOT NULL,
  PRIMARY KEY (`idMotorista`))
  ENGINE = InnoDB
  AUTO_INCREMENT = 18
  DEFAULT CHARACTER SET = latin1;

CREATE TABLE IF NOT EXISTS `Bravo`.`tb_gerenciador` (
  `idGerenciador` INT(11) NOT NULL AUTO_INCREMENT,
  `gerenciador_nomeFornecedor` VARCHAR(50) NOT NULL,
  `gerenciador_placaCaminhao` VARCHAR(8) NOT NULL,
  `gerenciador_nomeMotorista` VARCHAR(45) NOT NULL,
  `gerenciador_cnhMotorista` VARCHAR(15) NOT NULL,
  PRIMARY KEY (`idGerenciador`), 
  CONSTRAINT fk_gerenciador_nomeFornecedorr  FOREIGN KEY (`gerenciador_nomeFornecedor`) REFERENCES `tb_fornecedor` (`nomeFornecedor`),
  CONSTRAINT fk_gerenciador_placaCaminhao  FOREIGN KEY (`gerenciador_placaCaminhao`) REFERENCES `tb_caminhao` (`placaCaminhao`),
  CONSTRAINT fk_gerenciador_nomeMotorista FOREIGN KEY (`gerenciador_nomeMotorista`) REFERENCES `tb_motorista` (`nomeMotorista`),
  CONSTRAINT fk_gerenciador_cnhMotorista  FOREIGN KEY (`gerenciador_cnhMotorista`) REFERENCES `tb_motorista` (`cnhMotorista`))
  ENGINE = InnoDB
  AUTO_INCREMENT = 18
  DEFAULT CHARACTER SET = latin1;



SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Someone can help me??

  • The foreign key must uniquely identify a row of the target table. Use the primary key field of the target table as a foreign key.

1 answer

0


Basically the solution is this:

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,ALLOW_INVALID_DATES';

CREATE SCHEMA IF NOT EXISTS `Bravo` DEFAULT CHARACTER SET latin1 ;

USE `Bravo` ;

CREATE TABLE IF NOT EXISTS `Bravo`.`tb_fornecedor` (
  `idFornecedor` INT(11) NOT NULL AUTO_INCREMENT,
  `nomeFornecedor` VARCHAR(50) NOT NULL,
  `cnpjFornecedor` VARCHAR(45) NOT NULL,
  `contatoFornecedor` VARCHAR(45) NULL DEFAULT NULL,
  PRIMARY KEY (`idFornecedor`),
  UNIQUE INDEX `cnpjFornecedor_UNIQUE` (`cnpjFornecedor` ASC))
  ENGINE = InnoDB
  AUTO_INCREMENT = 18
  DEFAULT CHARACTER SET = latin1;

CREATE TABLE IF NOT EXISTS `Bravo`.`tb_caminhao` (
  `idCaminhao` INT(11) NOT NULL AUTO_INCREMENT,
  `placaCaminhao` VARCHAR(8) NOT NULL,
  `modeloCaminhao` VARCHAR(45) NOT NULL,
  `pesoFinalCaminhao` VARCHAR(45) NOT NULL,
  `pesoInicialCaminhao` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`idCaminhao`),
  UNIQUE INDEX `placa_UNIQUE` (`placaCaminhao` ASC))
  ENGINE = InnoDB
  AUTO_INCREMENT = 18
  DEFAULT CHARACTER SET = latin1;

CREATE TABLE IF NOT EXISTS `Bravo`.`tb_motorista` (
  `idMotorista` INT(11) NOT NULL AUTO_INCREMENT,
  `nomeMotorista` VARCHAR(45) NOT NULL,
  `cnhMotorista` VARCHAR(15) NOT NULL,
  PRIMARY KEY (`idMotorista`))
  ENGINE = InnoDB
  AUTO_INCREMENT = 18
  DEFAULT CHARACTER SET = latin1;

CREATE TABLE IF NOT EXISTS `Bravo`.`tb_gerenciador` (
  `idGerenciador` INT(11) NOT NULL AUTO_INCREMENT,
  `gerenciador_idFornecedor` INT(11) NOT NULL,
  `gerenciador_idCaminhao` INT(11) NOT NULL,
  `gerenciador_idMotorista` INT(11) NOT NULL,
  PRIMARY KEY (`idGerenciador`), 
  CONSTRAINT fk_gerenciador_idFornecedor  
    FOREIGN KEY (`gerenciador_idFornecedor`) 
      REFERENCES `tb_fornecedor` (`idFornecedor`),
  CONSTRAINT fk_gerenciador_idCaminhao  
    FOREIGN KEY (`gerenciador_idCaminhao`) 
      REFERENCES `tb_caminhao` (`idCaminhao`),
  CONSTRAINT fk_gerenciador_idMotorista 
    FOREIGN KEY (`gerenciador_idMotorista`) 
      REFERENCES `tb_motorista` (`idMotorista`))
  ENGINE = InnoDB
  AUTO_INCREMENT = 18
  DEFAULT CHARACTER SET = latin1;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Because you relate foreign key to the primary key being the one of the same type, ie if you made the table tb_gerenciador totally mistaken with the field names you can recover with SQL easily.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.