适用于:
Databricks SQL
Databricks Runtime
在表或具体化视图中添加、修改或删除列,或在 Delta Lake 表的列中添加、修改或删除字段。
所需的权限
如果使用 Unity Catalog,则必须具有 MODIFY 权限:
ALTER COLUMNADD COLUMNDROP COLUMN
所有其他操作都需要拥有该表的所有权。
语法
ALTER TABLE table_name
{ ADD COLUMN clause |
ALTER COLUMN clause |
DROP COLUMN clause |
RENAME COLUMN clause }
ADD COLUMN 子句
JDBC 数据源不支持此子句。
向表添加一列或多列,或将字段添加到 Delta Lake 表中的现有列。
注意
向现有 Delta 表添加列时,无法定义 DEFAULT 值。 对于现有行,添加到 Delta 表的所有列均视为 NULL。 添加列后,你可以有选择地定义列的默认值,但这仅适用于插入表中的新行。 使用以下语法:
ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT default_expression
语法
{ ADD [ COLUMN | COLUMNS ]
( { { column_identifier | field_name } data_type
[ COLLATE collation_name ]
[ DEFAULT clause ]
[ COMMENT comment ]
[ FIRST | AFTER identifier ]
[ MASK clause ] } [, ...] ) }
参数
-
要添加的列的名称。 名称在表中必须唯一。
除非指定了
FIRST或AFTER name,否则列或字段将追加到末尾。 -
要添加到现有列的字段的完全限定名称。 嵌套字段的路径的所有组件都必须存在,并且字段名称本身必须唯一。
若要将字段添加到嵌套在结构
MAP或类型中的ARRAY结构,请使用以下特殊名称:-
ELEMENTARRAY导航到元素。 -
KEYMAP导航到密钥。 -
VALUE导航到值MAP。
例如:
phonenumbers.element.countrycode将字段countrycode添加到数组的每个元素phonenumbers。 -
DEFAULT default_expression适用于:
Databricks SQL
Databricks Runtime 11.3 LTS 及更高版本为列定义一个
DEFAULT值,当未指定该列时,将在INSERT和MERGE ... INSERT上使用该值。 默认表达式中的任何STRING文本和STRING函数都将使用UTF8_BINARY排序规则。如果未指定默认值,则暗示
DEFAULT NULL将用于可为空的列。default_expression可由字面量和内置 SQL 函数或运算符组成,但以下函数除外:default_expression不得包含任何子查询。DEFAULT、CSV、JSON和PARQUET源支持ORC。-
指定列或字段的数据类型。 并非所有数据源都支持 Azure Databricks 支持的所有数据类型。
COLLATEcollation_name对于
data_type,STRING,可选择指定与列或字段一起使用的排序规则。 如果未指定排序规则,则适用UTF8_BINARY排序规则。COMMENT comment描述添加的列或字段的可选
STRING文本。如果要为 Unity Catalog 管理的表或表列添加 AI 生成的注释,请参阅将 AI 生成的注释添加到 Unity Catalog 对象。
FIRST如果指定,该列将作为表格的第一列添加,或者该字段将作为包含结构中的第一个字段添加。
AFTER标识符如果指定,则列或字段将立即添加到字段或列
identifier之后。-
适用于:
Databricks SQL
Databricks Runtime 12.2 LTS 及更高版本
仅限 Unity Catalog重要
此功能目前以公共预览版提供。
添加列掩码函数以对敏感数据进行匿名化处理。 该列的所有后续查询将会收到对该列计算该函数(而不是该列的原始值)的结果。 这对于细粒度的访问控制目的非常有用,在这种情况下,该函数可以检查调用用户的身份或组成员身份,以确定是否编辑该值。
ALTER COLUMN 子句
适用于:
Databricks SQL
Databricks Runtime
更改列的属性或位置。
语法
{ ALTER | CHANGE } [ COLUMN ]
{ { column_identifier | field_name }
{ COMMENT comment |
{ FIRST | AFTER column_identifier } |
{ SET | DROP } NOT NULL |
TYPE data_type |
SET DEFAULT clause |
DROP DEFAULT |
SYNC IDENTITY }
[, ... ]
在 Databricks Runtime 16.3 之前,该子句不支持在一条语句中更改多个列。
{ ALTER | CHANGE } [ COLUMN ]
{ column_identifier | field_name }
{ SET { MASK clause } |
DROP MASK |
SET TAGS clause |
UNSET TAGS clause }
参数
-
要更改的列的名称。
如果多次引用列标识符,Azure Databricks 将引发 NOT_SUPPORTED_CHANGE_SAME_COLUMN。
-
要更改的字段的完全限定名称。 嵌套字段的路径的所有组件都必须存在。
如果多次引用字段名称,Azure Databricks 将引发 NOT_SUPPORTED_CHANGE_SAME_COLUMN。
COMMENT comment更改
column_name列的说明。comment必须为STRING文本。FIRST或AFTER标识符将列从当前位置移到前面(
FIRST)或紧邻AFTER之后(identifier)。 只有table_name为 Delta 表时才支持此子句。TYPEdata_type适用于
Databricks SQL
Databricks Runtime 15.2 及更高版本更改
column_name列的数据类型。只有
table_name为 Delta 表时才支持此子句。所有 Delta 表都支持以下类型更改:
- 例如,将
VARCHAR列的大小从VARCHAR(5)增加到VARCHAR(10) - 将
CHAR列的类型更改为VARCHAR,例如,从CHAR(5)更改为VARCHAR(5) - 将
CHAR或VARCHAR列的类型更改为STRING,例如,从VARCHAR(10)更改为STRING。
如果将
delta.enableTypeWidening设置为true,则 Delta 表支持以下类型更改:重要
此功能在 Databricks Runtime 15.2 及更高版本中作为公共预览版提供。
源类型 支持的更广泛类型 BYTESHORT、、INTBIGINT、DECIMAL、DOUBLESHORTINT、、BIGINTDECIMAL、、DOUBLEINTBIGINT、DECIMAL、、DOUBLEBIGINTDECIMAL、DOUBLEFLOATDOUBLEDECIMAL具有更高精度和小数位数的 DECIMALDATETIMESTAMP_NTZ有关类型扩大的更多详细信息,请参阅类型扩大。
- 例如,将
SET NOT NULL或DROP NOT NULL更改有效列值的域以排除 null (
SET NOT NULL) 或包含 null (DROP NOT NULL)。 只有 Delta Lake 表支持此选项。 Delta Lake 将确保约束对所有现有和新数据有效。SYNC IDENTITY适用于:
Databricks SQL
Databricks Runtime 10.4 LTS 及更高版本将标识列的元数据与实际数据同步。 将自己的值写入标识列时,它可能与元数据不一致。 此选项可评估状态并更新元数据,以使其与实际数据保持一致。 在此命令后,下一个自动分配的标识值将从
start + (n + 1) * step开始,其中n是满足start + n * step >= max()的最小值(针对正步骤)。仅 Delta Lake 表上的标识列支持此选项。
DROP DEFAULT适用于:
Databricks SQL
Databricks Runtime 11.3 LTS 及更高版本从列中移除默认表达式。 对于可为空的列,这相当于
SET DEFAULT NULL。 对于使用NOT NULL定义的列,需要为以后的每个INSERT操作提供一个值SET DEFAULT default_expression适用于:
Databricks SQL
Databricks Runtime 11.3 LTS 及更高版本为列定义一个
DEFAULT值,当未指定该列时,将在INSERT和MERGE ... INSERT上使用该值。如果未指定默认值,则暗示
DEFAULT NULL将用于可为空的列。default_expression可由字面量、内置 SQL 函数或运算符组成,但以下函数除外:default_expression不得包含子查询。DEFAULT、CSV、JSON和ORC源支持PARQUET。为新添加的列定义默认值时,默认值适用于所有预先存在的行。 如果默认值包含非确定性函数(例如
rand或current_timestamp),则在执行ALTER TABLE时计算一次值,并将其作为常数应用于预先存在的行。 对于新插入的行,将对每行运行默认表达式一次。使用
ALTER COLUMN设置默认值时,现有行不受该更改的影响。SETMASK 子句适用于:
Databricks SQL
Databricks Runtime 12.2 LTS 及更高版本
仅限 Unity Catalog重要
此功能目前以公共预览版提供。
添加列掩码函数以对敏感数据进行匿名化处理。 该列的所有后续查询将会收到对该列计算该函数(而不是该列的原始值)的结果。 这对于细粒度的访问控制目的非常有用,在这种情况下,该函数可以检查调用用户的身份或组成员身份,以确定是否编辑该值。
DROP MASK适用于:
仅 Unity Catalog重要
此功能目前以公共预览版提供。
移除此列的列掩码(如果有)。 将来从此列进行查询会收到此列的原始值。
SET TAGS ( { tag_name = tag_value } [, ...] )适用于:
Databricks SQL
Databricks Runtime 13.3 LTS 及更高版本将标记应用于列。 需要具有
APPLY TAG权限才能向列添加标记。tag_name
一个文本
STRING。tag_name在表或列中必须唯一。tag_value
一个文本
STRING。
UNSET TAGS ( tag_name [, ...] )适用于:
Databricks SQL
Databricks Runtime 13.3 LTS 及更高版本从列中移除标记。 需要具有
APPLY TAG权限才能从列中移除标记。tag_name
一个文本
STRING。tag_name在表或列中必须唯一。
DROP COLUMN 子句
重要
此功能目前以公共预览版提供。
适用于:
Databricks SQL
Databricks Runtime 11.3 LTS 及更高版本
删除关系中的一个或多个列或字段。
删除列或字段时,必须删除相关检查约束和生成的列。
有关要求,请参阅使用 Delta Lake 列映射重命名和删除列。
语法
DROP [COLUMN | COLUMNS] [ IF EXISTS ] ( { {column_identifier | field_name} [, ...] )
参数
IF EXISTS指定
IF EXISTS时,Azure Databricks 会忽略删除不存在的列的尝试。 否则,删除不存在的列将导致错误。-
现有列的名称。
-
现有字段的完全限定名称。
RENAME COLUMN 子句
重要
此功能目前以公共预览版提供。
适用于:
Databricks SQL
Databricks Runtime 10.4 LTS 及更高版本
重命名启用了列映射的 Delta Lake 表中的列或字段。
重命名列或字段时,还需要更改相关检查约束和生成的列。 将删除使用该列的任何主键和外键。 在涉及外键时,你必须拥有定义该外键的表。
有关要求,以及如何启用列映射,请参阅 使用 Delta Lake 列映射重命名和删除列。
语法
RENAME COLUMN { column_identifier TO to_column_identifier|
field_name TO to_field_identifier }
参数
-
列的现有名称。
-
新的列标识符。 标识符在表中必须是唯一的。
-
字段的现有完全限定名称。
-
新的字段标识符。 标识符在本地结构中必须是唯一的。
示例
请参阅 ALTER TABLE 示例。