2010-09-26 4 views
41

J'ai une table mysql avec les colonnes suivantes:Utiliser plusieurs colonnes comme identifiant unique pour mysql

group_id 
game_id 
user_id 
message 
last_update 

Je veux faire en sorte que deux lignes peuvent exister lorsque la valeur de group_id pour la ligne x est égal à la valeur de group_id pour la ligne y AND la valeur de user_id pour la ligne x est également égale à la valeur de user_id pour la ligne y.

Ainsi, par exemple, disons que j'insère les valeurs suivantes suivantes:

group_id = 783 
game_id = 34 
user_id = 29237 
message = none 
last_update = 11233452 

Les données ci-dessus, même si une requête MySQL essaie d'insérer, ne devrait pas créer une nouvelle ligne si une ligne existe déjà avec la même combinaison de group_id et user_id. Y a-t-il un moyen de faire cela? Fondamentalement, j'essaye de faire fonctionner deux colonnes ensemble comme un index unique.

+0

Y a-t-il une raison pour laquelle group_id et user_id ne sont pas les clés primaires de cette table? – Gus

+0

Ils sont définis en tant qu'index, mais le fait d'être défini sur primary fait-il une différence pour essayer d'accomplir la tâche? Si oui, je peux les rendre primaires. – user396404

Répondre

82

Oui, MySQL offre la possibilité de le faire.

ALTER TABLE MyTable 
ADD UNIQUE KEY `my_unique_key` (`group_id`, `user_id`) 

Je ne sais pas ce que vous utilisez ce tableau pour, mais il semble que cette clé unique pourrait être un bon candidat pour la clé primaire de la table. Une clé primaire est également automatiquement une clé unique. Si vous décidez de faire la clé primaire, puis procédez comme suit à la place:

ALTER TABLE MyTable 
ADD PRIMARY KEY (`group_id`, `user_id`) 

(. Si vous recevez un message d'erreur qu'il existe déjà une clé primaire, émettre ensuite ALTER TABLE MyTable DROP PRIMARY KEY puis répétez la commande ci-dessus)

Edit: en réponse aux commentaires de l'utilisateur

Vous ne pouvez pas avoir plusieurs lignes avec NULL non identiques des valeurs pour les colonnes couvertes par la clé unique. Vous ne pouvez donc pas avoir deux lignes où group_id = 0 AND user_id = 5, par exemple. 0 est une valeur. Mais si vous rendez l'une des colonnes ou les deux NULL, vous pouvez avoir plusieurs lignes qui sont identiques jusqu'au positionnement de NULL s. Vous pouvez donc avoir deux (ou plusieurs) rangées où group_id IS NULL AND user_id = 1234. Proviso: Ce qui précède est vrai pour les deux moteurs de stockage MySQL communément utilisés (MyISAM et InnoDB). MySQL a des moteurs de stockage dans lesquels NULL est considéré comme une valeur unique, mais vous ne les utilisez probablement pas.

Si vous désactivez une ou les deux colonnes, votre clé unique ne peut pas être la clé primaire - une clé primaire doit être sur les colonnes NOT NULL.

Supposons que vous ayez fait de cette clé votre clé primaire et que vous souhaitiez maintenant autoriser NULL dans la colonne group_id. Je ne sais pas quel est le type de données group_id actuellement; Je suppose que c'est actuellement INT UNSIGNED NOT NULL, mais vous devrez modifier le ci-dessous si ce n'est pas le cas. Vous ne pourrez plus utiliser cette clé comme clé primaire. Voici une commande que vous pouvez exécuter pour effectuer les modifications souhaitées:

ALTER TABLE MyTable 
    DROP PRIMARY KEY, 
    MODIFY group_id INT UNSIGNED, 
    ADD UNIQUE KEY `my_unique_key_with_nulls` (`group_id`, `user`) 
+1

Merci beaucoup. – user396404

+0

Est-il possible de faire en sorte qu'ils ne fonctionnent ensemble comme une clé primaire/unique que si group_id! = '0'? – user396404

+0

Voir les rédacteurs – Hammerite

0

bien pour cela, vous pouvez créer une clé composite de group_id et user_id en utilisant n'importe quel éditeur mysql comme phpmyadmin ou sqlyog, et le marquer comme index unique.

Questions connexes