用名称中的句点重命名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中的列的主要内容,如果未能解决你的问题,请参考以下文章