3

我有一个 MySQL alter 语句

ALTER TABLE `employee`
ADD `employee_name_generator` CHAR(20) GENERATED ALWAYS AS
    (COALESCE(concat(`employee_name`), '^')) VIRTUAL;

这是添加employee_name_generator唯一约束所必需的。这在 MySQL 5.7 及以后的版本中运行良好。但是我需要这个的环境有 MySQL 5.6。MySQL 5.6 有替代方案吗?

4

2 回答 2

5

如果您的早期版本的 MySQL 不支持生成的列,那么您必须在查询时计算该列。一种选择是视图:

CREATE VIEW yourView AS (
    SELECT *, COALESCE(CONCAT(employee_name, '^')) AS employee_name_generator
    FROM employee
)

MySQL 不支持物化视图(直接)。所以,如果你真的需要物化视图的行为,你将不得不使用我上面给出的视图中的选择逻辑来创建一个临时表。

于 2018-06-18T06:11:51.127 回答
2

您可以使用触发器作为解决方法并获得类似的结果。

ALTER TABLE `employee`
ADD `employee_name_generator` CHAR(20);

delimiter //
create trigger trig_create_employee_name_generator before insert on `employee`
for each row
begin
   set NEW.`employee_name_generator` = COALESCE(concat(NEW.`employee_name`), '^');
end
//

如果您还要在插入后更新employee_name 字段,则还需要更新触发器:

delimiter //
create trigger trig_update_employee_name_generator before update on `employee`
for each row
begin
   set NEW.`employee_name_generator` = COALESCE(concat(NEW.`employee_name`), '^');
end
//

请记住,在 MySQL 5.6 中,每个表只有一个用于插入前的触发器和一个用于更新的触发器,因此如果您需要多个生成的列,则可以将 set 语句链接到“开始”和“结束”之间的同一个触发器中”。

于 2020-03-06T21:24:42.927 回答