2016-11-15 2 views
1

Je suis en train d'ajouter une contrainte de clé étrangère en utilisant un varchar au lieu d'habitude intvarchar comme une contrainte de clé étrangère

utilisateurs de table:

CREATE TABLE IF NOT EXISTS `users` (
`userId` int(11) NOT NULL AUTO_INCREMENT, 
`userFName` varchar(60) NOT NULL, 
`userLName` varchar(60) NOT NULL, 
`userEmail` varchar(100) NOT NULL, 
`userPassword` varchar(50) NOT NULL, 
PRIMARY KEY (`userId`) 
); 

courrier de table:

CREATE TABLE IF NOT EXISTS `mail` (
`mailId` int(11) NOT NULL AUTO_INCREMENT, 
`sender` varchar(100) NOT NULL, 
`receiver` varchar(100) NOT NULL, 
`mailSubject` varchar(255) NOT NULL, 
`mailContent` varchar(255) NOT NULL, 
`mailSendDate` datetime NOT NULL, 
CONSTRAINT fk_sender FOREIGN KEY (sender) REFERENCES users(userEmail), 
CONSTRAINT fk_receiver FOREIGN KEY (receiver) REFERENCES Users(userEmail),  
PRIMARY KEY (`mailId`) 
); 

I obtenir une erreur: la contrainte de clé étrangère échoue

+0

lorsque vous obtenez l'erreur? –

+0

lors de la création de la table de messagerie –

+2

Vous devez indexer userEmail –

Répondre

1

'userEmail' n'est pas une clé de votre table 'utilisateurs'. Une clé étrangère doit toujours référencer une clé primaire ou de substitution.

En outre, vous devez créer des index sur vos clés étrangères et la clé référencée et affirmer que les colonnes correspondantes ont des types de données similaires.

+0

va ajouter userEmail comme unique trier le problème? –

+0

Certaines bases de données n'acceptent pas varchar comme clé primaire. De plus, vous ne pouvez plus modifier le champ 'userEmail' lorsqu'il s'agit d'une clé primaire et référencée par une clé étrangère. – Patrick

+0

Mon erreur, je recevais une erreur différente. On dirait que le travail http://rextester.com/RZIHY18265 Maintenant, je ne sais pas pourquoi ma réponse fonctionne aussi. –

2

Vous devez faire référence à la place userId

Imaginez plus tard un user veulent changer email. Alors vous ne pourrez pas le changer parce qu'il y a une contrainte en place. Vous devrez supprimer le courrier, puis supprimer l'utilisateur, puis créer l'utilisateur et tous les e-mails. À la place, si vous faites référence à l'ID utilisateur, peu importe l'adresse électronique. De plus, la taille de l'index est plus petite car vous sauvegardez un entier au lieu de varchar.

+0

cela ne fonctionne pas, l'erreur indique: Impossible de trouver un index dans la table référencée où les colonnes référencées apparaissent dans les premières colonnes ou les types de colonne dans la table et la table référencée ne correspondent pas pour la contrainte. –

+0

Avez-vous créé des index sur votre clé et les clés étrangères? Selon http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html MySQL nécessite des index sur des clés étrangères et des clés référencées afin que les contrôles clés étrangers peuvent être rapide et ne nécessite pas de scan de table. Dans la table de référence, il doit y avoir un index où les colonnes de clé étrangère sont répertoriées en tant que premières colonnes dans le même ordre. – Patrick