Jak udokumentowano w CREATE INDEX
Składnia
:
Nie możesz zdefiniować indeksu dla wyrażenia (takiego jak podane w pytaniu), dlatego UNIQUE
MySQL indeksy nie mogą wymuszać ograniczenia, jak chcesz.
Zamiast tego możesz utworzyć BEFORE INSERT
wyzwalacz
który zgłasza błąd, jeśli pasujący rekord już istnieje:
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;;
Aby zapobiec UPDATE
od spowodowania podobnego problemu, prawdopodobnie będziesz chciał utworzyć podobny BEFORE UPDATE
również wyzwalacz.