Question

J'ai créé un modèle avec MySQL Workbench et je tente maintenant de l'installer à un mysql serveur.

Utilisation Fichier> Exporter> Ingénieur avant SQL Script ... CREER il affiche un beau gros fichier pour moi, avec tous les paramètres je demande. Je passer à MySQL Outils GUI (le navigateur de requête spécifique) et la charge jusqu'à ce script (notez que je forme un outil va MySQL officiel à l'autre). Cependant, lorsque je tente d'exécuter réellement ce fichier, je reçois la même erreur encore et

  

SQLSTATE [HY000]: Erreur générale: 1005   de créer la table peut   './Srs_dev/location.frm' (errno: 150)

« OK », dis-je à moi-même, quelque chose ne va pas avec la table de l'emplacement. Donc, je vérifie la définition dans le fichier de sortie.

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

ok Attend pour moi. Je présume que peut-être quelque chose ne va pas avec le navigateur de requêtes, donc je mets ce fichier sur le serveur et essayer de le charger de cette façon

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

Et je reçois la même erreur. Donc, je commence à Google cette question et de trouver tous les types de comptes qui parlent d'une erreur avec des tables de style InnoDB qui échouent avec les clés étrangères, et le correctif est d'ajouter « SET FOREIGN_KEY_CHECKS = 0; » au script SQL. Eh bien, comme vous pouvez le voir, qui est déjà partie du fichier que MySQL Workbench craché.

Alors, ma question est alors, pourquoi est-ce ne fonctionne pas quand je fais ce que je pense que je suis censé faire?

Info Version:

  • MySQL: 5.0.45

  • Outils graphiques: 1.2.17
  • Workbench: 5.0.30
Était-ce utile?

La solution

Le type du champ dans une clé étrangère doit être le même que le type de la colonne ils référence. Vous disposez (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 ,

vous essayez de se référer aux champs INT (dans les tableaux state et brand) avec des champs de TINYINT dans le tableau location. Je pense que l'erreur est qu'il se plaint de. Je ne sais pas comment il est arrivé en premier lieu, ou pourquoi mettre à zéro FOREIGN_KEY_CHECKS ne s'arrête pas MySQL de diagnostiquer l'erreur, mais ce qui se passe si vous corriger ce décalage de type?

Autres conseils

Pour d'autres qui cherchent à ce fil, il y a beaucoup de raisons que vous pouvez obtenir cette erreur:

Voir le lien suivant pour une liste complète des 150 errno, errno 121 et d'autres étrangères MySQL Erreurs clés:

MySQL Erreurs étrangères clés et Errno 150

viens de vérifier la réponse de @juacala de. Mais ne m'a pas aidé. Voici le message envoyé @ELIACOM quand je trouvé ma source d'ennuis.

  

Je suis en train de lire cette grande source de solutions, mais mon problème est pas   adressée. Je tentais d'ajouter un FK dans un pointage de table InnoDB à un   PK dans un MyISAM. Après avoir réglé le MyISAM InnoDB cela a fonctionné. je   vérifié votre liste entière avant de réaliser que. Vive.

J'avais même question. D'une certaine façon, je ne l'ai pas remarqué de mettre en valeur auto_increment à l'ID de table. Peut-être que cela aide quelqu'un.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top