用名称中的句点重命名clickhouse中的列

Posted

技术标签:

【中文标题】用名称中的句点重命名clickhouse中的列【英文标题】:Rename column in clickhouse with period in name 【发布时间】:2020-12-29 18:13:42 【问题描述】:

我正在尝试将列重命名为名称中带有句点的内容,但到目前为止还没有成功。

类似:

ALTER TABLE x RENAME COLUMN "id" TO "review.id"

失败:

DB::Exception: 无法将列从嵌套结构重命名为普通列,反之亦然。

尝试了以下方法来逃避这段时间:

    使用 \ 转义句点 - 保留反斜杠 名称周围的反引号 - 保留反引号

任何帮助将不胜感激!

【问题讨论】:

您根本不应该这样做。句点是任何数据库中 SQL 命令的保留字符。在列名中使用句点只会在您开始查询和加入此表时使事情变得混乱。例如,在 SQL 中,如果您在同一命令中有许多表,则可以使用表名或别名,并且您将需要使用句点,例如 select a.col1, b.col2...... from tablea a, tableb b 用句点命名列不仅是一个坏主意,而且是非常规的。某些数据库将允许您这样做,具体取决于它们的语法。再次不推荐,只需使用下划线即可。 CH 对嵌套列使用点(句点)字符。您不能将普通列重命名为嵌套列。 谢谢@DennyCrane。是否有另一种重命名方法。我想知道是否可以创建一个新列并复制另一个列的值。 为什么需要它?您可以在选择中使用别名。 select id as "x.id" 【参考方案1】:

带有的列用于定义Nested data structure。

使用此脚本添加嵌套列:

ALTER TABLE x ADD COLUMN `review.id` Array(Int32) DEFAULT [id]

但考虑到该列的类型是 Array(Int32) 而不是 Int32

┌─id─┬─value─┬─review.id─┐
│  0 │     0 │ [0]       │
│  1 │     2 │ [1]       │
│  2 │     4 │ [2]       │
│  3 │     6 │ [3]       │
..

要删除源列,请按照以下方式:

# synchronously materialize the values calculated based on DEFAULT
ALTER TABLE x 
UPDATE `review.id` = `review.id` 
WHERE 1
SETTINGS mutations_sync = 2

# remove DEFAULT expression
ALTER TABLE x MODIFY COLUMN `review.id` REMOVE DEFAULT

# ! check that no rows with uninitialized `review.id`
SELECT * FROM x WHERE `review.id` = []

# drop the source column (! be careful it leads to irrecoverable data loss)
ALTER TABLE x DROP COLUMN id

最好避免删除源列,而只需添加别名:

ALTER TABLE x ADD COLUMN `review.id` Int32 ALIAS id

【讨论】:

这可行,但您现在将有 2 列,并且您无法删除原始 id 列,因为新列依赖于它。不过很高兴知道默认为列值【参考方案2】:

试试这个

ALTER TABLE "table_name" 更改“第 1 列”“第 2 列”[“数据类型”];

【讨论】:

这不是真正的 Clickhouse 语法。没有变化

以上是关于用名称中的句点重命名clickhouse中的列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL 重命名数据库表中的列?

是否有任何已发布的编码风格指南用于重命名 SQL 视图中的列?

重命名 R 中的一个命名列

重命名 DB2 中的列

重命名 MySQL 中的列

使用迁移重命名laravel中的列