Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment implémenter un index unique bidirectionnel sur plusieurs colonnes

Dans mysql, la seule façon à laquelle je peux penser est d'ajouter quelques colonnes utilitaires comme

CREATE TABLE tbl_challenger (
  host int,
  challenger int,
  u0 int, u1 int
);

et ajoutez quelques déclencheurs qui définissent u0 et u1 au plus petit et au plus grand des deux :

CREATE TRIGGER uinsert BEFORE INSERT ON tbl_challenger
 FOR EACH ROW SET NEW.u0 = LEAST(NEW.host,NEW.challenger),
  NEW.u1 = GREATEST(NEW.host,NEW.challenger);
CREATE TRIGGER uupdate BEFORE UPDATE ON tbl_challenger
 FOR EACH ROW SET NEW.u0 = LEAST(NEW.host,NEW.challenger),
  NEW.u1 = GREATEST(NEW.host,NEW.challenger);

puis vous ajoutez un index unique sur (u0,u1)

CREATE UNIQUE INDEX uniqueness ON tbl_challenger(u0,u1);

Et maintenant, vous obtiendrez une erreur en essayant d'insérer une paire en double quelle que soit la commande.

Sur un SGBDR décent comme PostgreSQL vous seriez capable d'utiliser l'index sur l'expression :

CREATE UNIQUE INDEX uniqueness ON tbl_challenger
    ( LEAST(host,challenger), GREATEST( host,challenger) );

Alors changez avant qu'il ne soit trop tard;-)