You need to enable JavaScript to run this app.
导航
自增函数
最近更新时间:2024.12.31 16:19:07首次发布时间:2024.12.31 16:19:07

ByteHouse为您提供自增ID函数generateSnowflakeID,可实现类似MySQL方言系统下auto_increment函数的自增ID效果,如果数据源无法提供id,或是需要直写的场景,ByteHouse推荐您使用generateSnowflakeID函数。本文为您介绍自增函数的实现逻辑和使用方法。

实现逻辑

ByteHouse的ClickHouse方言系统下,generateSnowflakeID函数基于SnowflakeID来提供自增、唯一的ID(不保证连续和紧凑)。

注意

  • MySQL方言系统下的auto_increment,是从1开始的严格递增的唯一序列,如1, 2, 3等。
  • ClickHouse方言系统下generateSnowflakeID生成的序列,能保证递增和唯一,但不保证按序增长。

SnowflakeID的结构是一个 64 位的二进制数字(实际使用 63 位,以便适应有符号整数),组成如下:

  • 前 41 位表示时间戳,以毫秒为单位,从指定的纪元开始计算。
  • 接下来的 10 位表示机器 ID,用于避免冲突。
  • 再接下来的 12 位表示每台机器的序列号,允许在同一毫秒内生成多个 Snowflake ID。
  • 最终,这个数字通常以十进制形式序列化。

SnowflakeID 是按时间排序的,因为它是基于生成时的时间。此外,可以从 SnowflakeID 中提取其生成时间,用于获取在特定日期之前或之后创建的 SnowflakeID(及其关联对象)。

使用方法
  • 命令格式

    generateSnowflakeID();
    
  • 命令说明
    按照上文实现逻辑,返回一串十进制序列化后的自增ID数据。

  • 使用示例

    • 查询

      SELECT generateSnowflakeID();
      
    • 建表

      • ClickHouse方言系统:

        set dialect_type='CLICKHOUSE';
        CREATE TABLE t1(id Int64 DEFAULT generateSnowflakeID(), val1 String) 
        Engine=CnchMergeTree() Order by id;
        
      • MySQL方言系统:

        正确示例

        错误示例

        set dialect_type='MYSQL';
        create table t1(id Int64 auto_increment primary key, val1 String);
        ENGINE = CnchMergeTree
        ORDER BY tuple(id)
        UNIQUE KEY tuple(id)
        SETTINGS partition_level_unique_keys = 0, storage_policy = 'cnch_default_hdfs', allow_nullable_key = 1, storage_dialect_type = 'MYSQL', index_granularity = 8192
        

        说明

        以上示例与ClickHouse方言系统下的这段示例等效:

        CREATE TABLE t1 (
            `id` Int64 NOT NULL DEFAULT generateSnowflakeID(),
            `val1` String NULL
        )
        
        
        -- This is forbidden in MySQL, as auto_increment column must be the primary key but allowed on ByteHouse
        create table t1(id Int64 auto_increment, val1 String);
        
    • 写入

      正确示例

      错误示例

      • 示例1

        insert into t1 values (NULL,'a');
        SELECT * FROM t1;
        

        返回结果示例:

        ┌──────────────────id─┬─val1─┐
        │ 7242371370334552064 │ a    │
        └─────────────────────┴──────┘
        
      • 示例2

        insert into t1(val1) values ('a');
        
      -- not allowed in MySQL and ByteHouse -> exception
      insert into t1 values ('a');