sql >> Base de Datos >  >> RDS >> Mysql

Cómo implementar un índice único bidireccional en varias columnas

En mysql, la única forma que se me ocurre es agregar un par de columnas de utilidad como

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

y agregue un par de activadores que establezcan u0 y u1 al menor y al mayor de los dos:

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

luego agrega un índice único en (u0,u1)

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

Y ahora obtendrá un error al intentar insertar un par duplicado independientemente del orden.

En un RDBMS decente como PostgreSQL podría usar el índice en la expresión:

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

Entonces, cámbiate antes de que sea demasiado tarde;-)