You need to enable JavaScript to run this app.
文档中心
文档控制台
注册
ByteHouse云数仓版

ByteHouse云数仓版

复制全文
下载 pdf
函数参考
自增函数
复制全文
下载 pdf
自增函数

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');
      
最近更新时间:2025.07.17 11:18:02
这个页面对您有帮助吗?
有用
有用
无用
无用