ALTER TABLE 和生成的列

允许对生成的列执行的ALTER TABLE操作包括ADD、MODIFY和CHANGE。

●可以添加生成的列。

●可以修改生成列的数据类型和表达式

●生成列如果没有被其他列引用,那么可以重命名或者删除

●虚拟生成列不能更改为存储的生成列,反之亦然。要解决此问题,请删除列,然后使用新定义添加它。

●可以将非生成列更改为存储列,但不能更改为虚拟生成的列。

●存储但不是虚拟生成的列可以更改为非生成列。存储的生成值将成为非生成列的值。

●ADD COLUMN不是存储列的就地操作(在不使用临时表的情况下完成),因为表达式必须由服务器计算。对于存储的列,索引更改将就地完成,而表达式更改不会就地完成。对列注释的更改将就地完成。

●对于非分区表,ADD COLUMN和DROP COLUMN针对虚拟列是就地操作。但是,添加或删除虚拟列不能与其他ALTER TABLE操作一起就地执行。

对于分区表,ADD COLUMN和DROP COLUMN针对虚拟列不是就地操作。

●InnoDB支持虚拟生成列的二级索引。在虚拟生成的列上添加或删除二级索引是一个就地操作。

●将虚拟生成的列添加到表或修改时,不能确保生成的列表达式计算的数据不会超出该列的范围。这可能导致返回不一致的数据和意外失败的语句。为了控制是否对这些列进行验证,ALTER TABLE支持WITHOUT VALIDATION 和 WITH VALIDATION子句:

■ 使用WITHOUT VALIDATION(如果两个子句都没有指定,则为默认值),将执行就地操作(如果可能),不检查数据完整性,并且语句完成得更快。但是,如果值超出范围,以后从表中读取的内容可能会报告该列的警告或错误。

■ 使用WITH VALIDATION,ALTER TABLE复制表。如果发生超出范围或任何其他错误,则语句将失败。因为执行表复制,所以语句需要更长的时间。

只有ADD COLUMN、CHANGE COLUMN和MODIFY COLUMN操作才允许使用WITHOUT VALIDATION 和 WITH VALIDATION。否则,将发生ER_WRONG_USAGE错误。

●如果表达式求值导致截断或向函数提供不正确的输入,ALTER TABLE语句将以错误终止,DDL操作将被拒绝。

●更改列col_name的默认值的ALTER TABLE语句也可能更改使用col_name引用列的生成列表达式的值,而使用col_name引用列的生成列表达式的值也可能更改使用DEFAULT (col_name)引用列的生成列表达式的值。

官方文档: https://dev.mysql.com/doc/refman/8.0/en/alter-table-generated-columns.html