Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como implementar um índice exclusivo bidirecional em várias colunas


No mysql, a única maneira que consigo pensar é adicionar algumas colunas de utilitários como
CREATE TABLE tbl_challenger (
  host int,
  challenger int,
  u0 int, u1 int
);

e adicione alguns gatilhos que definem u0 e u1 ao menor e ao maior dos dois:
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);

então você adiciona um índice exclusivo em (u0,u1)
CREATE UNIQUE INDEX uniqueness ON tbl_challenger(u0,u1);

E agora você receberá um erro ao tentar inserir o par duplicado, independentemente do pedido.

Em um RDBMS decente como PostgreSQL você seria capaz de usar o índice na expressão:
CREATE UNIQUE INDEX uniqueness ON tbl_challenger
    ( LEAST(host,challenger), GREATEST( host,challenger) );

Então, mude antes que seja tarde demais;-)