在MySQL中如何将字符串列的串联作为唯一约束

在MySQL中如何将字符串列的串联作为唯一约束,mysql,sql,database,unique-key,Mysql,Sql,Database,Unique Key,我有一个表,比如employee,employee表有几个字段,比如 `salary` `name` `age` `designation` 其中只有名称可为空。我不能使它不为NULL,因为它正被现有代码使用 是否可以为上述所有列创建一个组合的唯一约束 当我尝试创建新的唯一约束时 ALTER TABLE `employee` ADD CONSTRAINT `employee_constraint` UNIQUE key (`salary`,`name`, `age`, `designatio

我有一个表,比如
employee
employee
表有几个字段,比如

`salary`
`name`
`age`
`designation`
其中只有
名称
可为空。我不能使它不为NULL,因为它正被现有代码使用

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

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

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

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

通常MySQL允许在
UNIQUE
约束中使用多个null。更多信息:

您可以使用生成的列只允许一个
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,则可以将虚拟列标记为

可以为列指定不可见属性。这些列将不会在SELECT*语句的结果中列出,也不需要在INSERT语句中为它们赋值,除非INSERT通过名称明确提及它们


它插入了完全相同的组合,比如(1000,'xyz',10,NULL)twiceRelated@baao这只显示了正在发生的事情,但没有任何解决方法,将其更改为related并撤回投票@lad2025非常感谢您回答这个问题。但这是针对MySQL版本5.7的。但是我们能为5.6版做吗?如果没有,还有什么可以做的?非常感谢,但想知道这对性能有什么影响??考虑到我一次插入大约1000条记录,在极端情况下一次更新5条记录,我认为这是最小的。但是你不应该相信任何话。只需对不正确的设置进行基线测试(测量完成工作的时间),然后对新的正确设置进行相同的测试(不允许重复)。看起来上面的代码不适用于MySQL 5。6@user9920500我相信生成的列可以从5.7中获得
ALTER TABLE employee MODIFY designation_virtual INVISIBLE;