Как иметь конкатенацию строковых столбцов как уникальное ограничение в MySQL - PullRequest
0 голосов
/ 10 июня 2018

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

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

, из которых только designation может быть пустым.Я не могу сделать его NOT NULL, так как он используется существующим кодом.

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

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

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

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

1 Ответ

0 голосов
/ 10 июня 2018

Обычно 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;  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...