You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Databricks中IDENTITY列手动/外部插入时为NULL的问题求助

解决Delta表IDENTITY列手动/外部插入时生成NULL的问题

问题场景

你通过以下SQL创建了带自动生成ID列的Delta表:

CREATE TABLE catalogname.schema.test(
    ID bigint  GENERATED BY DEFAULT AS IDENTITY  ,
    test1 string ,
    test2 string ,
    test3 string,
    test4 string ,
    test5 float ,
    test6 string ,
    Date timestamp 
)
USING DELTA
LOCATION "abfss://gold@teststroage.dfs.core.windows.net/test/data/test"

首次通过SQL批量加载数据时,ID列能正常自动生成序列值,但手动插入(仅指定部分列)或通过外部工具插入数据时,ID列始终被插入NULL。

原因分析

GENERATED BY DEFAULT AS IDENTITY的核心逻辑是:仅当插入语句完全不指定ID列,或显式传入DEFAULT时,才会自动生成序列值。出现NULL的常见原因:

  • 外部工具/客户端默认将ID列设为NULL传入(即使你没主动指定该列)
  • 会话级别的IDENTITY自动生成开关被禁用

解决方案

1. 插入时完全不指定ID列

执行插入操作时,只列出需要赋值的字段,完全排除ID列,让Spark自动为其生成值:

INSERT INTO catalogname.schema.test (test1, test2, test3, test4, test5, test6, Date)
VALUES ('val1', 'val2', 'val3', 'val4', 1.5, 'val6', current_timestamp())

2. 强制启用自动生成或显式使用DEFAULT

如果外部工具无法避免包含ID列,可通过两种方式处理:

  • 开启会话级开关,强制Spark忽略传入的NULL并自动生成ID:
    SET spark.databricks.delta.identityColumn.autoGenerate = true;
    
  • 在插入语句中为ID列显式指定DEFAULT:
    INSERT INTO catalogname.schema.test (ID, test1, test2)
    VALUES (DEFAULT, 'val1', 'val2')
    

3. 验证表的IDENTITY配置

执行以下命令确认ID列的生成策略是否正确:

DESCRIBE EXTENDED catalogname.schema.test;

查看输出中的Identity Columns部分,确保ID列的配置为GENERATED BY DEFAULT AS IDENTITY,且序列的起始值、增量参数正常。

内容的提问来源于stack exchange,提问作者Developer Rajinikanth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:22:07