Domanda

Ho creato un modello con MySQL Workbench e ora sto tentando di installarlo su un mysql server.

Utilizzando File> Esporta> Inoltra Ingegnere SQL creare uno script ... che viene emesso un grande file bello per me, con tutte le impostazioni che chiedo. Ho passare a MySQL GUI Tools (il Query Browser in particolare) e del carico up questo script (notare che io sto andando forma strumento di un funzionario MySQL ad un altro). Tuttavia, quando provo ad eseguire in realtà questo file, ottengo lo stesso errore più e più volte

  

SQLSTATE [HY000]: Errore generale: 1005   Non è possibile creare la tabella   './Srs_dev/location.frm' (errno: 150)

"OK", mi dico, c'è qualcosa di sbagliato con la tabella di posizione. Così ho check out la definizione nel file di output.

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

Sembra ok per me. Suppongo che forse qualcosa non va con il Query Browser, così ho messo il file sul server e provo a caricare in questo modo

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

E ottengo lo stesso errore. Così comincio a Google questo problema e trovare tutti i tipi di conti che parlano di un errore con tavoli in stile InnoDB che non riescono con chiavi esterne, e la correzione è di aggiungere "SET FOREIGN_KEY_CHECKS = 0;" allo script SQL. Ebbene, come si può vedere, che è già parte del file che MySQL Workbench sputò.

Quindi, la mia domanda è allora, perché è questo che non funziona quando sto facendo quello che penso che dovrei fare?

Versione Info:

  • MySQL: 5.0.45

  • tools grafici: 1.2.17
  • Workbench: 5.0.30
È stato utile?

Soluzione

Il tipo di campo in una chiave esterna deve essere lo stesso come il tipo di colonna che stanno riferimento. Sono disponibili le seguenti (Snipping):

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 ,

in modo che stai cercando di fare riferimento a INT campi (in tabelle state e brand) con campi TINYINT nella tabella location. Penso che sia l'errore è lamentarsi. Non so come è venuto in primo luogo, o perché azzeramento FOREIGN_KEY_CHECKS non si ferma MySQL da diagnosticare l'errore, ma cosa succede se si risolvere questo tipo non corrispondente?

Altri suggerimenti

Per gli altri guardando questa discussione, ci sono un sacco di ragioni che si può ottenere questo errore:

Si veda il seguente link per una lista completa per errno 150, numerr 121 e altri errori di chiave di MySQL esteri:

MySQL errori di chiave esteri e Errno 150

appena controllato la risposta di' @juacala. Ma non mi ha aiutato. Ecco il messaggio che ho inviato @ELIACOM quando ho trovato la mia fonte di problemi:.

  

stavo leggendo questa grande fonte di soluzioni, ma il mio problema non è   indirizzato. Stavo cercando di aggiungere un FK in una punta tavolo INNODB ad un   PK in un MyISAM. Dopo aver impostato il MyISAM a InnoDB ha funzionato. io   controllato tutta la lista prima di rendersi conto che. Cin cin.

Ho avuto lo stesso problema. In qualche modo non ho notato per impostare il valore AUTO_INCREMENT al tavolo id. Forse aiuta qualcuno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top