2009-08-10 14 views
2

Considérons une table utilisateur: Nom d'utilisateur, email1, mail2Deux colonnes Mysql avec contrainte d'unicité entre colonne1 et colonne2

Maintenant, je veux faire en sorte que deux lignes dans ce tableau ont une adresse e-mail commun . Quelle serait la meilleure façon d'assurer cela? Exemple: Si la table a une ligne: "Bill, bill @ email.com, bill @ gmail.com", puis en essayant d'insérer une ligne comme "Billy, billy @ yahoo.com, bill @ email.com" devrait donner une erreur.

Merci à l'avance, Chandresh

Répondre

1

Malheureusement, check contraintes ne sont pas une caractéristique de MySQL. Eh bien, ils le sont, mais ils sont ignorés.

Utilisez un trigger, au lieu:

create trigger MyValidation after insert on user for each row 
begin 
    if (select count(*) from user where 
     email1 = new.email1 
     or email1 = new.email2 
     or email2 = new.email1 
     or email2 = new.email2) > 0 then 
     --I know that the delete could use this logic, but you can 
     --insert other instructions here. 

     delete from user where username = new.username 

    end if 
end 
+0

Ceci est la bonne réponse à la question que j'ai posée. Mais malheureusement, mes besoins ont légèrement changé et, par conséquent, je vais utiliser une table distincte pour le mappage de l'utilisateur de messagerie. – Champ

0

Peut-être que vous pourriez utiliser une sorte de procédure stockée, mais cela peut être quelque chose que vous pouvez vérifier avant d'insérer vos données.

SELECT email1, email2 FROM yourTable 
WHERE email1 LIKE %@email% or email2 LIKE %@email% 
4

On dirait que vous essayez de forcer un combo entre 1: 1 et 1: multiple avec votre modèle de données. Votre meilleur pari est de stocker chaque combo Nom d'utilisateur/Email séparément. Une ligne pour "Username, email1" et une autre ligne pour "Username, email2". Si vous avez des champs supplémentaires "Nom d'utilisateur", ceux-ci pourraient rester dans la table Utilisateur principal, alors que les emails se déplaceraient vers une table Email à deux colonnes avec un index unique sur plusieurs colonnes (Nom d'utilisateur, Email).

+0

Je pensais juste à la même réponse lorsque je projetais de regarder cette page pour trouver des réponses. La raison pour laquelle je choisis ceci est "nom d'utilisateur, email, rebondi" ... alors, vous voyez, j'ai besoin d'un drapeau rebondi aussi et qui sait quoi de plus tard. – Champ

+0

Oh oui, cela évite également le cas d'un utilisateur entrant le même email pour email1 et email2. :-) – Champ

Questions connexes