Можно ли сделать уникальный ключ в MySQL с несколькими столбцами, один из которых может быть нулевым?

Например, в таблице есть три столбца integer..

Эти строки: 1-1-1 и 1-1-1 - не являются уникальными, по этому если есть первая, вторую создать никак..
А эти строки: 1-NULL-1 и 1-NULL-1, хоть и "не являются уникальными", всё равно можно создавать...

Как создать unique ключ, чтобы строки 1-NULL-1 и 1-NULL-1 всё-таки перестали быть уникальными?


Ответы (1 шт):

Автор решения: Roman Konoval

Предположим, что nullable поле называется X.

Создайте новое виртуальное вычисляемое поле того же типа (назовем его X_non_null) в таблице базируясь на значении из X. Если значение NULL, то в X_non_null устанавливайте не NULL значение, которое точно не встретится в X, т.е определение такого поля будет:

X_non_null INT GENERATED ALWAYS AS (IFNULL(X, -1))

И теперь создавайте уникальное ограничение используя X_non_null вместо X.

Спасибо Akina за подсказку этой относительно новой возможности в mysql. В версиях до 5.7 и других БД, где нет вычисляемых полей, это можно делать тригеррами.

→ Ссылка