如何添加自己依赖的生成列?

时间:2019-07-06 16:38:52

标签: mysql sql

我想使用MYSQL添加一个生成的列,该列基本上取决于其他一些列以及在某些情况下其自身。可以这样做吗?

在添加具有默认值的生成列时,我也遇到一些错误。这是我正在尝试的命令:

ALTER TABLE temp
ADD COLUMN abc INT AS 
(CASE 
    WHEN cde > 95 THEN "1"
    WHEN cde < 80 THEN "0"
    WHEN (cde > 79 AND cde < 96) THEN abc
END) DEFAULT 0

我可以使用生成的列实现类似的功能吗?

2 个答案:

答案 0 :(得分:1)

不,您不能自己生成生成的列引用。

https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html说:

  

生成的列定义可以引用其他生成的列,但只能引用表定义中较早出现的列。

由于生成的列始终从引用其他列的表达式中获取其值,因此为其赋予DEFAULT子句没有任何意义。

要执行您要描述的操作,可以这样操作:

ALTER TABLE temp
ADD COLUMN abc INT AS 
(CASE 
    WHEN cde > 95 THEN "1"
    WHEN cde < 80 THEN "0"
    WHEN (cde > 79 AND cde < 96) THEN 0
END)

答案 1 :(得分:1)

啊,现在我明白了你要做什么。如果发生cde更改,在某些情况下您只想更改abc,在其他情况下则不希望。

因此,它不是您要查找的生成的列,因为此类列仅取决于行的当前字段。 您想要一个触发器,它会根据abc的新值来更改cde或不更改。

看看有关如何编写此类触发器的文档:https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html

  

在BEFORE触发器中,如果您具有UPDATE特权,则还可以使用SET NEW.col_name = value更改其值。这意味着您可以使用触发器来修改要插入到新行中或用于更新行的值。 (这样的SET语句在AFTER触发器中无效,因为行更改已经发生。)