sql >> Database >  >> RDS >> Mysql

Hoe een bidirectionele unieke index over meerdere kolommen te implementeren

In mysql is de enige manier die ik kan bedenken om een ​​paar hulpprogrammakolommen toe te voegen, zoals

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

en voeg een aantal triggers toe die u0 . instellen en u1 tot de minste en grootste van de twee:

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

dan voeg je een unieke index toe op (u0,u1)

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

En nu krijg je een foutmelding wanneer je een dubbel paar probeert in te voegen, ongeacht de volgorde.

Op een fatsoenlijke RDBMS zoals PostgreSQL je zou index op uitdrukking kunnen gebruiken:

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

Schakel dus over voordat het te laat is;-)



  1. Haal de meest recente rij op met groep op en Laravel

  2. Hoe de korte maandnaam van een datum in MySQL te krijgen

  3. Hoe maak je een tabel met een externe sleutelbeperking in SQL Server - SQL Server / TSQL-zelfstudie, deel 66

  4. Bij het uitvoeren van UPDATE ... datetime =NOW(); zullen alle bijgewerkte rijen dezelfde datum/tijd hebben?