文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  ALTER TABLE 和生成列

15.1.9.2 ALTER TABLE 和生成列

ALTER TABLE 允许对生成列执行的操作包括 ADDMODIFYCHANGE

  • 可以添加生成列。

    CREATE TABLE t1 (c1 INT);
    ALTER TABLE t1 ADD COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED;
  • 可以修改生成列的数据类型和表达式。

    CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) STORED);
    ALTER TABLE t1 MODIFY COLUMN c2 TINYINT GENERATED ALWAYS AS (c1 + 5) STORED;
  • 如果没有任何其他列引用生成列,则可以重命名或删除生成列。

    CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) STORED);
    ALTER TABLE t1 CHANGE c2 c3 INT GENERATED ALWAYS AS (c1 + 1) STORED;
    ALTER TABLE t1 DROP COLUMN c3;
  • 无法将虚拟生成列更改为存储生成列,反之亦然。要解决此问题,请删除该列,然后使用新的定义添加该列。

    CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL);
    ALTER TABLE t1 DROP COLUMN c2;
    ALTER TABLE t1 ADD COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED;
  • 无法将非生成列更改为存储生成列,但可以更改为虚拟生成列。

    CREATE TABLE t1 (c1 INT, c2 INT);
    ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED;
  • 可以将存储生成列(而非虚拟生成列)更改为非生成列。存储的生成值将成为非生成列的值。

    CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) STORED);
    ALTER TABLE t1 MODIFY COLUMN c2 INT;
  • ADD COLUMN 对存储列不是就地操作(在不使用临时表的情况下完成),因为服务器必须计算表达式。对于存储列,索引更改就地完成,表达式更改不就地完成。列注释的更改就地完成。

  • 对于非分区表,ADD COLUMNDROP COLUMN 对虚拟列是就地操作。但是,如果与其他 ALTER TABLE 操作组合使用,则无法就地添加或删除虚拟列。

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

  • InnoDB 支持虚拟生成列的二级索引。在虚拟生成列上添加或删除二级索引是就地操作。有关详细信息,请参阅 第 15.1.20.9 节,“二级索引和生成列”

  • 当向表中添加 VIRTUAL 生成列或修改现有生成列时,无法保证生成列表达式计算出的数据不会超出该列的范围。这可能导致返回不一致的数据,并出现意外的语句失败。为了控制是否对这些列进行验证,ALTER TABLE 支持 WITHOUT VALIDATIONWITH VALIDATION 子句。

    • 使用 WITHOUT VALIDATION(如果未指定任何子句,则为默认值),将执行就地操作(如果可能),不会检查数据完整性,并且语句将更快地完成。但是,如果值超出范围,则稍后从该表读取数据可能会报告警告或错误。

    • 使用 WITH VALIDATIONALTER TABLE 将复制该表。如果出现超出范围的错误或任何其他错误,则该语句将失败。由于执行了表复制,因此该语句需要更长时间。

    WITHOUT VALIDATIONWITH VALIDATION 仅允许与 ADD COLUMNCHANGE COLUMNMODIFY COLUMN 操作一起使用。否则,将发生 ER_WRONG_USAGE 错误。

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

  • 更改列 col_name 的默认值的 ALTER TABLE 语句也可能会更改使用 col_name 引用该列的生成列表达式的值,这可能会更改使用 DEFAULT(col_name) 引用该列的生成列表达式的值。因此,更改列定义的 ALTER TABLE 操作如果任何生成列表达式使用 DEFAULT(),则会导致表重建。