分类目录归档:数据库

clickhouse解决自增id

clickhouse本身并不支持创建自增列,原因是clickhouse是分布式的,基于此特性,我们可以联想到“在分布式数据库中如何创建唯一自增id?”这一问题。

关于这个问题,其实网络上已经有很多答案了,这里我们举例几种常见的做法。

  1. 雪花算法
  2. 基于Redis缓存生成
  3. 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 函数,这里就不再赘述。