2009-07-05 17 views
18

Ho creato un modello con MySQL Workbench e ora sto tentando di installarlo su un server mysql.MySQL: creazione tabella con errore FK (errno 150)

Utilizzando File> Esporta> Inoltra Ingegnere SQL CREATE script ... emette un bel file di grande per me, con tutte le impostazioni che chiedo. Passo a MySQL GUI Tools (il browser delle query in particolare) e carica questo script (nota che sto andando a formare uno strumento MySQL ufficiale con un altro). Tuttavia, quando provo ad eseguire in realtà questo file, ottengo lo stesso errore più e più

SQLSTATE[HY000]: General error: 1005 Can't create table './srs_dev/location.frm' (errno: 150)

"OK", mi dico, c'è qualcosa di sbagliato con la tabella di posizione. Quindi controllo la definizione nel file di output.

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@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) ; 

Mi sembra ok. 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ì inizio a Google questo problema e trovo tutti i tipi di account che parlano di un errore con tabelle di stile InnoDB che non funzionano con chiavi esterne e la correzione è di aggiungere "SET FOREIGN_KEY_CHECKS = 0;" allo script SQL. Bene, come puoi vedere, questo è già parte del file che MySQL Workbench ha sputato.

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

Version Info:

  • MySQL 5.0.45

  • GUI Tools: 1.2.17
  • Workbench: 5.0.30
+1

Anche se non è il caso nel vostro SQL, lo stesso errore è causato anche dal non avere nomi di chiavi esterne univoci tra le tabelle. –

risposta

40

Il tipo di campo in un la chiave esterna deve essere uguale al tipo della colonna a cui fanno 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 , 

Così si sta cercando di fare riferimento a INT campi (in tabelle state e brand) con TINYINT campi nella tabella location. Penso che sia l'errore di cui si lamenta. Non sei sicuro di come sia venuto fuori, o perché azzerare FOREIGN_KEY_CHECKS non impedisca a MySQL di diagnosticare l'errore, ma cosa succede se risolvi questo tipo di corrispondenza mancata?

+2

OK, um ... haha. Wow, è imbarazzante. Ero così occupato a cercare qualcosa di sbagliato nella relazione reale che non ho controllato le colonne stesse. Grazie per il secondo paio di occhi su questo! –

+3

Wow! È successo anche quando si mescolano "INT" e "INT UNSIGNED". Sì, questa è stata colpa mia; ma MySQL Workbench ha bisogno di un avvertimento a riguardo! – Mauro

+1

Grazie mille !!!! Ho semplicemente dovuto aggiungere UNSIGNED a tutte le chiavi esterne INT. –

9

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

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

MySQL Foreign Key Errors and Errno 150

+1

Sì, grazie! A proposito, adoro il fumetto di xkcd. Posso relazionarmi in grande stile! Saluti. – SecondSun24

+1

Questa era la risposta di cui avevo bisogno. Il mio problema era MyISAM invece di InnoDB. – Ryan

-2

Ho avuto lo stesso problema. In qualche modo non mi sono accorto di impostare il valore auto_increment sull'ID della tabella. Forse aiuta qualcuno.

+5

'AUTO_INCREMENT' o no, non ha effetto sulla validità della chiave esterna. –

0

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

I was reading this great source of solutions, but my issue is not adressed. I was trying to add an FK in a INNODB table pointing to a PK in a MyISAM. After setting the MyIsam to INNODB it worked. I checked your whole list before realizing that. Cheers.

+0

Questo è lì, ma per alcune versioni, l'aggiunta di chiave esterna non riesce in modo silenzioso. È il n. 2 nella lista sotto "altri errori di chiave esterna" – juacala

Problemi correlati