Как объединить строковые столбцы в качестве уникального ограничения в MySQL

У меня есть таблица с надписью employee В таблице employee есть несколько полей, таких как

`salary`
`name`
`age`
`designation`

Из них только designation допускает значение NULL. Я не могу сделать его НЕ NULL, поскольку он используется существующим кодом.

Можно ли создать комбинированное уникальное ограничение для всех упомянутых выше столбцов ??

Когда я пытаюсь создать новое уникальное ограничение.

ALTER TABLE `employee` ADD CONSTRAINT `employee_constraint` 
UNIQUE key (`salary`,`name`, `age`, `designation`);

Он успешно создает ограничение, но когда я пытаюсь вставить дублированную комбинацию этих записей, она успешно вставляется. Есть ли лучший способ создать ограничение и отказаться от повторяющейся комбинации этих столбцов?

Он вставляет точно такую ​​же комбинацию, скажем (1000, 'xyz', 10, NULL) дважды

user9920500 10.06.2018 10:33

@baao Это только показывает, что происходит, но не обходится

Lukasz Szozda 10.06.2018 10:42

Правильно, изменил его на связанный и отозвал голос @ lad2025

baao 10.06.2018 10:43

Большое спасибо за ответ на вопрос. Но это для MySQL версии 5.7. Но можно ли это сделать для версии 5.6? Если нет, что еще можно сделать?

user9920500 14.06.2018 13:29

«сгенерированный столбец» не поддерживается в MySQL 5.6. Есть ли альтернатива?

user9920500 14.06.2018 13:44
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
6
1 182
1

Ответы 1

Обычно 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


Если вы используете 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 записей в крайнем случае ??

user9920500 14.06.2018 13:51

Я бы сказал, что минимальный. Но ни в коем случае нельзя доверять никаким словам. Просто выполните базовый тест с вашей неправильной настройкой (измерьте время для выполнения работы), затем сделайте то же самое для новой правильной настройки (дублирование не допускается).

Lukasz Szozda 14.06.2018 13:56

Похоже, что приведенный выше код не работает для MySQL 5.6.

user9920500 14.06.2018 14:58

@ user9920500 Я считаю, что сгенерированные столбцы доступны с версии 5.7

Lukasz Szozda 14.06.2018 19:06

Другие вопросы по теме