2012-02-06 7 views
3

Je rencontre un problème avec MySQL pour une simple addition apparente d'une clé étrangère. J'ai demandé à Google, mais en vain. Ici va:Problème de clé étrangère SQL Problème

Créer première table avec:

| users | CREATE TABLE `users` (
    `username` varchar(32) NOT NULL DEFAULT '', 
    `firstname` varchar(128) DEFAULT NULL, 
    `lastname` varchar(128) DEFAULT NULL, 
    `password` varchar(32) DEFAULT NULL, 
    PRIMARY KEY (`username`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 | 

Créer seconde table avec:

| contacts | CREATE TABLE `contacts` (
    `username` varchar(32) DEFAULT NULL, 
    `name` varchar(128) DEFAULT NULL, 
    `phonenumber` varchar(32) DEFAULT NULL, 
    `address` varchar(128) DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 | 

Maintenant je dois ajouter une clé étrangère de contacts "liens avec les 'utilisateurs'.

ALTER TABLE contacts ADD FOREIGN KEY (username) references USERS(username)); 

mais je reçois cette erreur: erreur 1064 (42000): Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de ')' à la ligne 1

L'objectif est évidemment de s'assurer que toutes les entrées dans 'contacts' ont une entrée 'nom d'utilisateur' correspondante dans 'utilisateurs '.

Environnement: Ubuntu 11.04, MySQL 5.1.58

Je dois être fait quelque part une erreur stupide. Suggestions bienvenues.

Répondre

5

D'abord, changer le moteur de ces tableau 2 de MyISAM à InnoDB. MyISAM ne supporte pas les contraintes FOREIGN KEY:

ALTER TABLE users 
ENGINE = InnoDB ; 

ALTER TABLE contacts 
ENGINE = InnoDB ; 

Ensuite, ajoutez la FOREIGN KEY, en supprimant la parenthèse supplémentaire. Il y a 2 façons de le faire. Avec le code que vous aviez, qui ajoutera automatiquement un index (clé) sur la colonne username:

ALTER TABLE contacts 
    ADD FOREIGN KEY (username) 
    REFERENCES users(username); 

Ou explictedly ajouter l'indice (Key) vous et la contrainte de clé étrangère (vous aussi choisir le nom de l'index et contrainte vous-même):

ALTER TABLE contacts 
    ADD KEY username_ie (username), 
    ADD CONSTRAINT users_contacts_fk 
    FOREIGN KEY (username) 
    REFERENCES users(username); 
+0

Cela s'est avéré être la solution réelle. Merci ypercube. – sphere4a

+0

La solution: MyISAM ne supporte pas les clés étrangères. Fait ce InnoDB. En outre, il y avait 2 erreurs de syntaxe dans l'instruction de table ALTER ci-dessus. Il devrait se lire comme suit: ALTER TABLE contacts ADD CONTRAINT FOREIGN KEY (nom d'utilisateur) référence les utilisateurs (nom d'utilisateur); Surveillez les accolades et le nom de la table minuscule. Problème résolu. Merci les gars. J'adore ce stackoverflow. – sphere4a

+0

@ sphere74: Les noms de tables sensibles à la casse (ou non) dépendent des paramètres d'installation: [Identifier Case Sensitivity] (http://dev.mysql.com/doc/refman/5.1/en/identifier-case-sensitivity.html) –

5
ALTER TABLE contacts ADD FOREIGN KEY (username) references USERS(username)); 

Vous avez une parenthèse supplémentaire à la fin de la ligne.

devrait être

ALTER TABLE contacts ADD CONSTRAINT FOREIGN KEY (username) references USERS(username); 
+0

Super ... Bonne prise ... Merci Sathya – sphere4a