我有一张表employee
employee
表中有很少的字段,例如
`salary`
`name`
`age`
`designation`
其中只有designation
可以为空。由于现有代码正在使用它,因此我无法将其设为NOT NULL。
是否可以为上述所有列创建组合唯一约束?
当我尝试创建一个新的唯一约束时。
ALTER TABLE `employee` ADD CONSTRAINT `employee_constraint`
UNIQUE key (`salary`,`name`, `age`, `designation`);
它成功创建了约束,但是当我尝试插入这些记录的重复组合时,它会成功插入。有没有更好的方法来创建约束并丢弃这些列的重复组合?
答案 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;