2010-01-20 13 views
4

J'ai utilisé MySQL Workbench pour préparer une mise en page de base de données et l'ai exportée vers ma base de données en utilisant phpMyAdmin. Lorsque l'on regarde une table, je suis l'avertissement suivant:Clés PRIMARY et INDEX pour une colonne FOREIGN dans MySQL

primaire et les clés INDEX ne doivent pas tous deux être définis pour la colonne gid

gid est un indice étranger qui est la clé primaire d'une autre table , et qui fait également partie de la clé primaire de la table actuelle. Je l'ai donc comme partie de la clé primaire et Workbench a créé un index pour l'entrée de clé étrangère. Alors pourquoi cet avertissement apparaît-il, devrais-je l'ignorer, ou devrais-je repenser la mise en page de ma base de données?

Ceci est un exemple très simplifié de la structure utilisée, qui produit l'avertissement:

CREATE TABLE IF NOT EXISTS `test_groups` (
    `gid` INT NOT NULL , 
    `gname` VARCHAR(45) NULL , 
    PRIMARY KEY (`gid`)); 

CREATE TABLE IF NOT EXISTS `test_users` (
    `gid` INT NOT NULL , 
    `uid` INT NOT NULL , 
    `name` VARCHAR(45) NULL , 
    PRIMARY KEY (`gid`, `uid`) , 
    INDEX `gid` (`gid` ASC) , 
    CONSTRAINT `gid` 
    FOREIGN KEY (`gid`) 
    REFERENCES `test_groups` (`gid`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE); 

modifier J'ai essayé de supprimer l'index supplémentaire pour gid dans phpMyAdmin et il semble fonctionner. L'action en cascade se produit toujours lorsque vous modifiez quelque chose dans la table des groupes, donc je suppose que la relation étrangère est intacte même sans l'index.

Mais pourquoi MySQL Workbench me force-t-il à conserver cet index? Je ne peux pas l'enlever manuellement tant que la clé étrangère est là.

Répondre

0

J'ai résolu ce problème maintenant. Il semble que le moteur de stockage de base de données par défaut a été défini sur MyISAM sur mon serveur. Par conséquent, comme je ne l'ai pas explicitement spécifié, toutes les relations de clés étrangères sont simplement supprimées (sans le dire). Après l'avoir converti en InnoDB je n'ai plus l'avertissement, donc il semble que tout fonctionne comme il se doit. Cependant, dans ce cas particulier, je vais m'en tenir à MyISAM, et laisser les relations de clés étrangères à l'extérieur pour le moment, car je veux incrémenter automatiquement le second attribut de cette clé multiple (et cela n'est pas supporté par InnoDB) , et c'est un peu plus utile pour cette application que d'avoir des clés étrangères (surtout lorsque vous avez des données où la mise à jour et la suppression seront très rarement effectuées).

Également en ce qui concerne MySQL Workbench, ce comportement semble toujours être un peu bogué, et il était déjà reported.

+0

Ce bogue est incorrectement marqué comme une copie d'un autre bogue corrigé. [Ceci est le bogue actuel pertinent.] (Http://bugs.mysql.com/bug.php?id=53277) – phazei

2

Rien à redire. Même si c'était la clé primaire entière de la table actuelle, elle est toujours potentiellement correcte. En effet, à moins que vous ne soyez un de ces "programmeurs" qui n'utilise que des colonnes auto-incrémentées pour les clés primaires, vous allez voir beaucoup de choses.

+0

Il est donc correct que l'index supplémentaire est créé pour la clé étrangère? Et désolé, mais je ne comprends pas la deuxième partie de votre réponse. – poke

+0

Désolé - J'ai supposé qu'il était en train de se poser la question d'avoir un champ comme clé primaire et étrangère. Oui, le second index est redondant, mysql utilisera volontiers l'index de clé primaire pour retourner les lignes interrogées par 'gid'. Ce sera très légèrement moins efficace - mais vous ne serez jamais capable de mesurer la différence. C. – symcbean