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

Gibt es eine Problemumgehung zum Definieren einer eindeutigen Einschränkung, die NULL-Werte als nicht eindeutig behandelt?

Wie unter CREATE INDEX dokumentiert Syntax :

Sie können keinen Index über einen Ausdruck definieren (wie in Ihrer Frage angegeben), daher MySQLs UNIQUE Indizes können die Einschränkung nicht wie gewünscht erzwingen.

Stattdessen können Sie einen BEFORE INSERT erstellen Auslöser das einen Fehler auslöst, wenn bereits ein passender Datensatz existiert:

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

Um UPDATE zu verhindern Um ein ähnliches Problem zu vermeiden, möchten Sie wahrscheinlich einen ähnlichen BEFORE UPDATE erstellen auch auslösen.