2017-08-14 3 views
0

Je dois créer et utiliser une base de données pour un projet de classe. J'ai développé la base de données et l'application localement en utilisant mysql workbench. Il doit être hébergé sur un autre service appelé myphpmyadmin. le problème est quand je crée mes tables en utilisant la ligne d'exécution de mysql dans ce service j'obtiens l'erreur suivante.Erreur de requête MySql 150 puzzle

Error 
SQL query: 

CREATE TABLE IF NOT EXISTS `artists_residence` (

`artists_id` INT(11) , 
`city_id` INT(11) , 
PRIMARY KEY ( `artists_id` , `city_id`) , 
CONSTRAINT FOREIGN KEY ( `artists_id`) REFERENCES `artists` ( `id`) ON DELETE CASCADE ON UPDATE CASCADE , 
CONSTRAINT FOREIGN KEY ( `city_id`) REFERENCES `city` ( `id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE = INNODB CHARSET = Latin1; 

MySQL said: Documentation 

#1005 - Can't create table 'fondellb-db.artists_residence' (errno: 150) 

Voici le fichier entier de mySql que j'essaie d'exécuter.

CREATE TABLE IF NOT EXISTS `artists` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `fname` VARCHAR(255) NOT NULL, 
    `lname` VARCHAR(255) NOT NULL, 
    `year_of_birth` DATE NOT NULL, 
    `year_of_death` DATE NULL DEFAULT NULL, 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB CHARSET = Latin1; 


CREATE TABLE IF NOT EXISTS `country` (
    `country_id` INT(11) NOT NULL, 
    `name` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`country_id`)) 
ENGINE = InnoDB CHARSET = Latin1; 


CREATE TABLE IF NOT EXISTS `city` (
    `id` INT(11) NOT NULL, 
    `name` VARCHAR(255) NOT NULL, 
    `fk_country_id` INT(11), 
    PRIMARY KEY (`id`, `fk_country_id`), 
    CONSTRAINT `country_id` 
    FOREIGN KEY (`fk_country_id`) 
    REFERENCES `country` (`country_id`) 
    ON DELETE RESTRICT 
    ON UPDATE RESTRICT) 
ENGINE = InnoDB CHARSET = Latin1; 

CREATE TABLE IF NOT EXISTS `Medium` (
    `id` INT(11) NOT NULL, 
    `name` VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB CHARSET = Latin1; 


CREATE TABLE IF NOT EXISTS `artists_medium` (
    `artists_id` INT(11), 
    `medium_id` INT(11), 
    PRIMARY KEY (`artists_id`, `medium_id`), 
    CONSTRAINT 
    FOREIGN KEY (`artists_id`) 
    REFERENCES `artists` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT 
    FOREIGN KEY (`medium_id`) 
    REFERENCES `Medium` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE) 
ENGINE = InnoDB CHARSET = Latin1; 

CREATE TABLE IF NOT EXISTS `artists_residence` (
    `artists_id` INT(11), 
    `city_id` INT(11), 
    PRIMARY KEY (`artists_id`, `city_id`), 
    CONSTRAINT 
    FOREIGN KEY (`artists_id`) 
    REFERENCES `artists` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT 
    FOREIGN KEY (`city_id`) 
    REFERENCES `city` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE) 
ENGINE = InnoDB CHARSET = Latin1; 

Je ne comprends pas ce qui échoue dans la requête finale. Toutes les autres requêtes sont réussies et les tables ont été créées. Ive a joué avec cette requête dans toutes sortes de variations et rien ne semble résoudre l'erreur. J'ai supprimé les index explicites, j'ai changé l'ordre des contraintes, vérifié toutes mes comparaisons de type. C'est un fichier que mysql a exporté en fonction du modèle que j'ai conçu, donc je ne sais pas pourquoi maintenant je reçois cette erreur. S'il vous plaît ne me référez pas à une référence au code d'erreur ou à un autre poste qui reçoit également ce code d'erreur, je sais ce qui peut causer l'erreur, mais je me demande ce qui le cause ici.

+0

Je préfère d'abord construire les tables et les index, et ensuite ajouter les contraintes – Strawberry

Répondre

0

Dans ce cas - vous créez la clé étrangère suivante

CONSTRAINT FOREIGN KEY ( `city_id`) REFERENCES `city` ( `id`) ON DELETE CASCADE ON UPDATE CASCADE 

alors que city table ne possède pas une clé primaire id, mais une clé primaire composite.

De toute évidence, la seule colonne de la 2 ne peut pas garantir l'unicité de la valeur, par conséquent, mysql vous empêche de créer un tel FK. Vous devez donc soit changer le PK city, soit le FK artists_residence de city.

+0

ok quand je mets PK de 'city' à (' id') au lieu de ('id',' fk_country_id') je reçois la même erreur encore. Je ne sais pas exactement comment corriger cette référence. – benpaul

+1

@benpaul essayez d'ajouter les champs/contraintes un par un jusqu'à ce qu'il échoue. Ensuite, vous savez exactement pourquoi cela échoue. – zerkms