Signaler

Mysql comment creer une clé unique sur deux colonnes d'un table [Fermé]

Posez votre question Maliq 8Messages postés lundi 15 février 2010Date d'inscription 25 juillet 2015 Dernière intervention - Dernière réponse le 30 juil. 2015 à 15:46 par kolm3
Bonjour,

je veux creer une table sur lequelle je veux ajouter une contrainte UNIQUE sur deux colonnes.. cette contrainte doit agir dans les deux sens ça veux dire qu'une seul occurence col1 col2 ou col2 col1 peut exister.
en plus je cherche a faire une autre contrainte qui fait que la meme valeur ne peut pas etre dans les deux colonnes en meme temps.
l'image ici illuste les deux problemes:



j'aimerai une solution robuste pour de large tables. (rapide) et qui ne soit pas si compliqué.
merci beaucoup en avance
Utile
+0
plus moins
Le plus simple serait :
CREATE TABLE table_test (
  col1 int(11) NOT NULL,
  col2 int(11) NOT NULL,
  label varchar(255),

  CONSTRAINT pk_table_test PRIMARY KEY (col1, col2),
  CHECK (col1 <> col2)
);

CONSTRAINT pk_table_test PRIMARY KEY (col1, col2)
permet de créer un clé primaire sur deux champs, si tu tiens à utiliser UNIQUE tu peux faire
UNIQUE (col1, col2)
.
MAIS :
CHECK est lu mais ignoré par les moteurs de stockage (ce qui est vraiment dommage).

Il faut donc passer par un trigger pour vérifier le contenu du insert avant l'insertion dans la table. Avant tout il faut savoir qu'un trigger est stocké à l'échelle d'une base de données.

Ajout d'un Trigger :
  • En passant par l'interface en ligne de commande MySQL :

DELEMITER $$
CREATE TRIGGER trigger_table_test BEFORE INSERT ON table_test
FOR EACH ROW
BEGIN
  IF NEW.col1 = NEW.col2 THEN
    SIGNAL SQLSTATE '45000';
  END IF;
END;$$
  • En passant par phpMyAdmin :

Aller dans le menu des triggers, déclancheur en français (en étant sur la base de données contenant la table visée) :

Et d'appuyer sur le bouton "Add trigger" ou "Ajouter un déclancheur" puis de compléter la fenêtre qui s'ouvre :

Une fois le trigger enregistré si on tente
INSERT INTO table_test VALUES (1, 1, "blabla");
une erreur apparaît :
#1644 - Unhandled user-defined exception condition 


Plus d'infos sur les triggers :

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !