You need to enable JavaScript to run this app.
导航
自增函数
最近更新时间:2025.07.17 11:18:02首次发布时间:2024.12.31 16:19:07
复制全文
我的收藏
有用
有用
无用
无用

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

实现逻辑

ByteHouse CDW 的 ClickHouse 方言系统下,generateSnowflakeID函数基于 SnowflakeID 来提供自增、唯一的 ID(不保证连续和紧凑)。
MySQL 方言系统下,ByteHouse CDW 的默认会忽略 auto_increment 关键词,您可通过手动设置 set enable_auto_increment=1 可以打开。启用后,系统会在 DDL 中将 auto_increment 改写成generateSnowflakeID();您也可以手动将列的函数改成 generateSnowflakeID(),具体使用方法请参见下文使用方法

注意

  • MySQL 方言系统下的auto_incrementgenerateSnowflakeID 的改写,自增 ID 并不是从 1 开始的自增 ID,如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方言系统:

        正确示例
        错误示例

        ByteHouse 引擎改写前:

        set dialect_type='MYSQL';
        create table t1(id Int64 auto_increment primary key, val1 String);
        

        ByteHouse 引擎改写后:

        CREATE TABLE t1 (
         `id` Int64 NOT NULL DEFAULT generateSnowflakeID(),
         `val1` String NULL
        )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
        
        -- MySQL 中不允许这种用法,因为自增列(auto_increment column)必须是主键;但 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');