Utiliser plusieurs colonnes comme identifiant unique pour mysql

J’ai une table mysql avec les colonnes suivantes:

group_id game_id user_id message last_update 

Je veux faire en sorte qu’il n’y ait pas deux lignes où la valeur de group_id pour la ligne x est égale à la valeur de group_id pour la ligne y ET la valeur de user_id pour la ligne x est également égale à la valeur de user_id pour la ligne y.

Par exemple, disons que j’insère les valeurs 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 de l’insérer, ne doivent pas créer de nouvelle ligne si une ligne existe déjà avec la même combinaison group_id et user_id. Y a-t-il un moyen de faire cela? Essentiellement, j’essaie de faire fonctionner deux colonnes un peu comme un index unique.

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 pour quoi vous utilisez cette table, mais il semble que cette clé unique puisse être un candidat fort pour la clé primaire de la table. Une clé primaire est automatiquement une clé unique. Si vous décidez d’en faire la clé primaire, procédez comme suit:

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

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

Edit: En réponse au commentaire de l’utilisateur

Vous ne pouvez pas avoir plusieurs lignes avec des valeurs non NULL identiques 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 définissez une ou les deux colonnes, vous pouvez avoir plusieurs lignes identiques au positionnement de NULL s. Vous pouvez donc avoir deux (ou plus) lignes où group_id IS NULL AND user_id = 1234 .

Proviso: Ce qui précède est vrai pour les deux moteurs de stockage MySQL couramment utilisés (MyISAM et InnoDB). MySQL dispose de moteurs de stockage dans lesquels NULL est considéré comme une valeur unique, mais vous ne les utilisez probablement pas.

Si vous annulez une ou les deux colonnes, votre clé unique ne peut pas être la clé primaire – une clé primaire doit figurer sur des 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 type de groupe group_id est actuellement; Je suppose que c’est actuellement INT UNSIGNED NOT NULL , mais vous devrez le modifier si ce n’est pas cela. Vous ne pourrez plus utiliser cette clé comme clé primaire. Voici une commande que vous pouvez exécuter pour apporter 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`) 

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.