clickhouse本身并不支持创建自增列,原因是clickhouse是分布式的,基于此特性,我们可以联想到“在分布式数据库中如何创建唯一自增id?”这一问题。
关于这个问题,其实网络上已经有很多答案了,这里我们举例几种常见的做法。
- 雪花算法
- 基于Redis缓存生成
- UUID
在clickhouse中我们同样可以使用上述方法解决自增ID的问题,基于clickhouse本身来说,我们可以使用雪花算法和UUID方法快速解决问题,Redis就稍微复杂一点,因为它是一个额外的东西,需要我们编写额外的代码来维护,这里不做讨论。
下面以实际例子来演示如何在clickhouse创建唯一自增ID列,例如我现在的需求是将data.parquet文件导入clickhouse中,这个文件中不包含唯一值,所以需要我们在导入时将唯一ID写进去。
clickhouse为我们提供了许多有用的函数,其中就包括生成雪花ID和UUID的函数,我们可以直接使用它们。
使用生成雪花ID函数 generateSnowflakeID
语法
SQL
generateSnowflakeID([expr, [machine_id]])
参数
expr
— An arbitrary expression used to bypass common subexpression elimination if the function is called multiple times in a query. The value of the expression has no effect on the returned Snowflake ID. Optional.machine_id
— A machine ID, the lowest 10 bits are used. Int64. Optional.
实际操作,因为我是单机部署的clickhouse,所以machine_id
写了1
SQL
CREATE TABLE table_name ENGINE = MergeTree PRIMARY KEY (id) ORDER BY (id) AS SELECT generateSnowflakeID(1) as id, * FROM file('data.parquet', Parquet)
UUID也类似,使用 generateUUIDv4 函数,这里就不再赘述。