ON CLUSTER 子句允许在集群中更改 profile,参见 Distributed DDL。
替换设置与修改设置
ALTER SETTINGS PROFILE 支持用两种不同的方式来更改某个 profile 的设置及其父级 (继承的) profile。两者的行为差异很大,因此务必选择合适的方式。
替换形式:直接使用 SETTINGS / INHERIT
SETTINGS 子句 (不带 ADD、MODIFY 或 DROP) 会用你列出的内容完整替换该 profile 的 settings 列表及其所有父 profile。凡是之前存在但未列出的内容,都会被静默删除——不会有任何警告。
CREATE SETTINGS PROFILE 中 SETTINGS 的行为相同:该子句定义的是完整的设置列表。
增量形式:ADD / MODIFY / DROP
ADD、MODIFY 和 DROP 关键字会修改单个条目,而不会影响 profile 中的其他内容:
ADD SETTINGS variable = value [constraints]— 添加尚未存在的设置。MODIFY SETTINGS variable = value [constraints]— 替换单个设置条目。整个条目 (值和约束) 都会被覆盖,因此如果你想保留MIN/MAX/READONLY/等内容,需要重新指定。DROP SETTINGS variable [,...]— 删除列出的设置。ADD PROFILES 'profile_name' [,...]/DROP PROFILES 'profile_name' [,...]— 添加或删除父级 (继承的) profile。DROP ALL SETTINGS/DROP ALL PROFILES— 删除所有设置或所有父级 profile。
DROP SETTINGS a ADD SETTINGS b = 1。
SET variable = value 是 MODIFY SETTINGS variable = value 的别名。之所以提供这种写法,是因为 SET 更符合直觉,而且在本想进行增量修改时,误写成用于替换的 SETTINGS 子句是很常见的错误。
示例
SHOW CREATE SETTINGS PROFILE 验证结果:
增量与完全替换
ADD SETTINGS 或 MODIFY SETTINGS (见下方示例) 。
ADD 与 MODIFY 的区别
ADD SETTINGS 和 MODIFY SETTINGS 都会保留 profile 中的其他设置,但它们对同一设置已有条目的处理方式不同:
ADD SETTINGS variable = value ...会先删除variable的现有条目,再插入新条目。因此,它会连同该设置的所有约束一起替换其值。对于variable,此前定义的任何MIN、MAX或可写性 (READONLY/WRITABLE/CONST/CHANGEABLE_IN_READONLY) ,如果你没有再次指定,都会被丢弃。MODIFY SETTINGS variable = value ...会按字段逐一合并:它只会覆盖你实际指定的字段 (值、MIN、MAX或可写性) ,而该设置的其他字段则保持不变。
示例
MODIFY SETTINGS
MODIFY 是按字段逐一合并的,因此如果只更改某个设置的值,就会保留其现有约束:
ADD SETTINGS
MODIFY 不同,如果仅使用一个值再次运行 ADD,会删除此前为该设置定义的约束: