Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So implementieren Sie einen bidirektionalen eindeutigen Index über mehrere Spalten hinweg

In mysql kann ich mir nur vorstellen, ein paar Hilfsspalten wie

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

und fügen Sie ein paar Trigger hinzu, die u0 setzen und u1 dem Geringsten und Größten der beiden:

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

dann fügen Sie einen eindeutigen Index zu (u0,u1) hinzu

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

Und jetzt erhalten Sie eine Fehlermeldung, wenn Sie versuchen, doppelte Paare einzufügen, unabhängig von der Reihenfolge.

Auf einem anständigen RDBMS wie PostgreSQL Sie könnten den Index für den Ausdruck verwenden:

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

Also, umsteigen, bevor es zu spät ist;-)