MySQL5.6中生成列的替代方法是什么

xzv2uavs  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(410)

我有一个声明

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

这是添加 employee_name_generator 在唯一约束中。这在MySQL5.7以后的版本中运行良好。但是我需要的环境是MySQL5.6。MySQL5.6有替代方案吗?

ar5n3qh5

ar5n3qh51#

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

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\u 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
//

请记住,在MySQL5.6中,每个表只有一个用于插入前的触发器和一个用于更新的触发器,因此如果需要多个生成的列,可以将set语句链接到“begin”和“end”之间的同一个触发器中。

zujrkrfu

zujrkrfu2#

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

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

mysql不支持物化视图(直接)。因此,如果您真的需要一个物化视图的行为,那么您必须使用上面给出的视图中的select逻辑创建一个临时表。

相关问题