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

vxqlmq5t  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(278)

我有一张table employee 这个 employee 表中几乎没有字段,例如

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

其中只有 designation 可为空。我不能使它不为null,因为它正被现有代码使用。
是否可以为上面提到的所有列创建一个组合的唯一约束??
当我尝试创建新的唯一约束时。

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

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

v440hwme

v440hwme1#

通常mysql允许在 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 .
列可以被赋予不可见属性。这些列将不会在select*语句的结果中列出,也不需要在insert语句中为它们赋值,除非insert显式地按名称提及它们。

ALTER TABLE employee MODIFY designation_virtual INVISIBLE;

相关问题