Mysql
 sql >> Base de données >  >> RDS >> Mysql

Existe-t-il une solution de contournement pour définir une contrainte unique qui traite les valeurs NULL comme non distinctes ?

Comme documenté sous CREATE INDEX Syntaxe :

Vous ne pouvez pas définir un index sur une expression (comme indiqué dans votre question), donc le UNIQUE de MySQL les index ne peuvent pas appliquer la contrainte comme vous le souhaitez.

Au lieu de cela, vous pouvez créer un BEFORE INSERT déclencheur qui génère une erreur si un enregistrement correspondant existe déjà :

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

Pour empêcher UPDATE s de causer un problème similaire, vous voudrez probablement créer un BEFORE UPDATE similaire déclencher aussi.