Mysql
 sql >> Database >  >> RDS >> Mysql

Come implementare un indice univoco bidirezionale su più colonne

In mysql l'unico modo che mi viene in mente è aggiungere un paio di colonne di utilità come

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

e aggiungi un paio di trigger che impostano u0 e u1 al minore e al maggiore dei due:

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);

quindi aggiungi un indice univoco su (u0,u1)

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

E ora riceverai un errore nel tentativo di inserire una coppia duplicata indipendentemente dall'ordine.

Su un RDBMS decente come PostgreSQL potresti usare l'indice sull'espressione:

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

Quindi, cambia prima che sia troppo tardi;-)