如何在MySQL

时间:2018-06-10 08:29:28

标签: mysql sql database unique-key

我有一张表employee employee表中有很少的字段,例如

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

其中只有designation可以为空。由于现有代码正在使用它,因此我无法将其设为NOT NULL。

是否可以为上述所有列创建组合唯一约束?

当我尝试创建一个新的唯一约束时。

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

它成功创建了约束,但是当我尝试插入这些记录的重复组合时,它会成功插入。有没有更好的方法来创建约束并丢弃这些列的重复组合?

1 个答案:

答案 0 :(得分:2)

通常,MySQL允许UNIQUE约束中的多个NULL。更多信息:Does MySQL ignore null values on unique constraints?

您可以使用生成的列只允许一个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;