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

Maliq 8 Messages postés lundi 15 février 2010Date d'inscription 25 juillet 2015 Dernière intervention - 25 juil. 2015 à 17:52 - Dernière réponse : kolm3 17 Messages postés jeudi 30 juillet 2015Date d'inscription 1 août 2015 Dernière intervention
- 30 juil. 2015 à 15:46
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
Afficher la suite 

1 réponse

kolm3 17 Messages postés jeudi 30 juillet 2015Date d'inscription 1 août 2015 Dernière intervention - 30 juil. 2015 à 15:46
0
Utile
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 :