У меня есть таблица с надписью employee В таблице employee есть несколько полей, таких как
`salary`
`name`
`age`
`designation`
Из них только designation допускает значение NULL. Я не могу сделать его НЕ NULL, поскольку он используется существующим кодом.
Можно ли создать комбинированное уникальное ограничение для всех упомянутых выше столбцов ??
Когда я пытаюсь создать новое уникальное ограничение.
ALTER TABLE `employee` ADD CONSTRAINT `employee_constraint`
UNIQUE key (`salary`,`name`, `age`, `designation`);
Он успешно создает ограничение, но когда я пытаюсь вставить дублированную комбинацию этих записей, она успешно вставляется. Есть ли лучший способ создать ограничение и отказаться от повторяющейся комбинации этих столбцов?
Связанные MySQL игнорирует нулевые значения в уникальных ограничениях?
@baao Это только показывает, что происходит, но не обходится
Правильно, изменил его на связанный и отозвал голос @ lad2025
Большое спасибо за ответ на вопрос. Но это для MySQL версии 5.7. Но можно ли это сделать для версии 5.6? Если нет, что еще можно сделать?
«сгенерированный столбец» не поддерживается в MySQL 5.6. Есть ли альтернатива?






Обычно 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;
Если вы используете MariaDB 10.3.3, вы можете пометить виртуальный столбец как INVISIBLE.
Columns can be given an INVISIBLE attribute. These columns will then not be listed in the results of a SELECT * statement, nor do they need to be assigned a value in an INSERT statement, unless INSERT explicitly mentions them by name.
ALTER TABLE employee MODIFY designation_virtual INVISIBLE;
Большое спасибо, но хотел знать, как это влияет на производительность ?? Учитывая, что я вставляю сразу около 1000 записей и обновляю сразу 5 записей в крайнем случае ??
Я бы сказал, что минимальный. Но ни в коем случае нельзя доверять никаким словам. Просто выполните базовый тест с вашей неправильной настройкой (измерьте время для выполнения работы), затем сделайте то же самое для новой правильной настройки (дублирование не допускается).
Похоже, что приведенный выше код не работает для MySQL 5.6.
@ user9920500 Я считаю, что сгенерированные столбцы доступны с версии 5.7
Он вставляет точно такую же комбинацию, скажем (1000, 'xyz', 10, NULL) дважды