Обычно MySQL допускает несколько значений NULL в ограничении UNIQUE
.Дополнительная информация: MySQL игнорирует нулевые значения для уникальных ограничений?
Вы можете использовать сгенерированный столбец, чтобы разрешить только одно NULL
значение:
CREATE TABLE employee(salary INT, name VARCHAR(100)
,age INT, designation VARCHAR(100)
,designation_virtual VARCHAR(100) AS (COALESCE(designation, '^'))
);
ALTER TABLE employee ADD CONSTRAINT employee_constraint
UNIQUE key (salary,name, age, designation_virtual) ;
INSERT INTO employee(salary, name, age, designation)
VALUES(1000, 'xyz', 10, NULL);
INSERT INTO employee(salary, name, age, designation)
VALUES(1000, 'xyz', 10, NULL);
-- Duplicate entry '1000-xyz-10-^' for key 'employee_constraint'
SELECT * FROM employee;
DBFiddle Demo
Если вы используете MariaDB 10.3.3, вы можете пометить виртуальный столбец как INVISIBLE
.
Столбцам может быть присвоен атрибут INVISIBLE.Эти столбцы не будут перечислены в результатах оператора SELECT *, и им не нужно присваивать значение в операторе INSERT, если только INSERT явно не упомянет их по имени.
ALTER TABLE employee MODIFY designation_virtual INVISIBLE;