Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak zaimplementować dwukierunkowy unikalny indeks w wielu kolumnach

W mysql jedynym sposobem, jaki przychodzi mi do głowy, jest dodanie kilku kolumn narzędziowych, takich jak

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

i dodaj kilka wyzwalaczy, które ustawiają u0 i u1 do najmniejszego i największego z dwóch:

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

następnie dodajesz unikalny indeks na (u0,u1)

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

A teraz pojawi się błąd podczas próby wstawienia zduplikowanej pary niezależnie od kolejności.

Na przyzwoitym RDBMS, takim jak PostgreSQL mógłbyś użyć indeksu na wyrażeniu:

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

Więc zmień, zanim będzie za późno;-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL utf8mb4, Błędy podczas zapisywania emotikonów

  2. Filtruj zapytania django według znaków Unicode 🐲 lub 💎 itp

  3. JEŚLI NIE ISTNIEJE w wyzwalaczu

  4. Zapytanie Mysql Datediff

  5. Łączenie tabel InnoDB z tabelami MyISAM