Mysql
 sql >> Database >  >> RDS >> Mysql

Esiste una soluzione alternativa per definire un vincolo univoco che tratti i valori NULL come non distinti?

Come documentato in CREATE INDEX Sintassi :

Non puoi definire un indice su un'espressione (come quella fornita nella tua domanda), quindi UNIQUE di MySQL gli indici non possono applicare il vincolo come desideri.

Invece, puoi creare un BEFORE INSERT trigger che genera un errore se esiste già un record corrispondente:

DELIMITER ;;

CREATE TRIGGER uniq1 BEFORE INSERT ON my_table FOR EACH ROW
  IF EXISTS(
    SELECT *
    FROM   my_table
    WHERE  column1 <=> NEW.column1 AND column2 <=> NEW.column2
    LIMIT  1
  ) THEN
    SIGNAL
      SQLSTATE '23000'
      SET MESSAGE_TEXT = 'Duplicate entry for key uniq1';
  END IF;;

Per impedire UPDATE s dal causare un problema simile, probabilmente vorrai creare un BEFORE UPDATE simile attivare anche.