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

H2数据库主键插入NULL异常问题及对应表结构说明

问题分析与解决方案

首先,你的问题根源在于主键字段POS_TRANS_ID同时使用了IDENTITY和自定义序列的DEFAULT设置,这在H2数据库中会产生冲突,加上主键的NOT NULL约束,最终导致插入时出现NULL值相关的报错。

为什么会冲突?

H2的IDENTITY关键字会让字段使用数据库内置的自增序列来生成值,而你又手动指定了DEFAULT (NEXT VALUE FOR SCMSA_HIST.KEY_GEN_SEQ),这会让数据库无法确定应该使用哪种方式生成主键值。如果插入时你没有显式指定主键值,或者试图插入NULL,就会触发约束报错。

解决方案

根据你的需求,有两种可行的修复方式:

方案1:保留自定义序列,移除IDENTITY关键字

如果你想继续使用自己定义的KEY_GEN_SEQ序列来生成主键,需要修改表结构,去掉IDENTITY关键字,同时明确主键约束:

CREATE TABLE IF NOT EXISTS SCMSA_HIST.SCMSA_POS_TRANS_ROLLUP (
    POS_TRANS_ID INTEGER DEFAULT (NEXT VALUE FOR SCMSA_HIST.KEY_GEN_SEQ) NOT NULL PRIMARY KEY,
    JOB_LOG_ID INTEGER,
    DEALER_CODE VARCHAR(255),
    STORE_ID VARCHAR(255),
    TRANSACTION_DT TIMESTAMP,
    QUANTITY INTEGER,
    ROLLUP_TYPE VARCHAR(255),
    CREATE_DT TIMESTAMP,
    MAX_TRANSACTION_DT TIME
    -- 补充你遗漏的其他字段
);

修改后,插入数据时不需要指定POS_TRANS_ID字段,数据库会自动从自定义序列中取值填充;或者你也可以显式使用DEFAULT关键字:

INSERT INTO SCMSA_HIST.SCMSA_POS_TRANS_ROLLUP (POS_TRANS_ID, JOB_LOG_ID, DEALER_CODE)
VALUES (DEFAULT, 1001, 'DLR_007');

方案2:使用H2内置IDENTITY,移除自定义序列依赖

如果你不需要自定义序列,直接依赖H2的内置自增机制即可,修改表结构如下:

CREATE TABLE IF NOT EXISTS SCMSA_HIST.SCMSA_POS_TRANS_ROLLUP (
    POS_TRANS_ID INTEGER NOT NULL IDENTITY PRIMARY KEY,
    JOB_LOG_ID INTEGER,
    DEALER_CODE VARCHAR(255),
    STORE_ID VARCHAR(255),
    TRANSACTION_DT TIMESTAMP,
    QUANTITY INTEGER,
    ROLLUP_TYPE VARCHAR(255),
    CREATE_DT TIMESTAMP,
    MAX_TRANSACTION_DT TIME
    -- 补充你遗漏的其他字段
);

这种情况下,插入数据时同样不需要指定主键字段,H2会自动生成递增的主键值。

注意事项

  • 绝对不要显式向POS_TRANS_ID插入NULL值,因为它是NOT NULL的主键,数据库会直接拒绝这类操作。
  • 如果已经创建了表,需要先删除原表(或者使用ALTER TABLE修改字段定义)再重新创建,确保修改生效。

内容的提问来源于stack exchange,提问作者Praveen kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:43:25