关闭

出现 DB2 SQL Error: SQLCODE = -798, SQLSTATE = 428C9 错误的原因及解决方法

标签: DB2SQLCODE798SQLSTATE428C9
1670人阅读 评论(0) 收藏 举报
分类:

1 错误描述

在通过「DbVisualizer」执行 SQL 语句插入数据的时候,报出如下错误:

ERROR

2 错误原因

通过观察上述标记出来的错误描述:

DB2 SQL Error: SQLCODE = -798, SQLSTATE = 428C9, SQLERRMC = ID

然后,查询「史上最全的 DB2 错误代码大全」可知,此错误的原因为:

-798 428C9 不能把一个值插入到用 GENERATED ALWAYS 定义的 ROWID 列

现在,我们在来看看我所使用的表的创建语句:

CREATE TABLE TBL_USER_CARD (
    ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY,
    VERSION INTEGER,
    USER_NAME VARCHAR(126) NOT NULL,
    CARD_NAME VARCHAR(16) NOT NULL,
    PRIMARY KEY (ID)
);

观察上述 SQL 语句及报出信息,我们可以发现在建表语句中,字段 ID 的后面确实定义了GENERATED ALWAYS AS IDENTITY的列属性,而报出信息里面也提到了 ID,因此我们可以确定问题就出在 ID 字段上面啦!那么在插入数据的时候,为什么会报这个错误呢?

实际上,在 DB2 中对于自增字段,我们可以通过如下两种方式指定:

  • 第 1 种GENERATED BY DEFAULT AS IDENTITY
  • 第 2 种GENERATED ALWAYS AS IDENTITY

两者的区别在于,第 1 种方式在插入数据时允许指定自增字段的值,只要不重复即可,并且数据库会自动设置下一个值;第 2 种方式则不允许指定,只能由数据库自动分配并插入。

通过观察建表语句,显然我们在建表的时候,是用第 2 种方式将字段 ID 设置为自增字段的,而我在插入语句的时候,却指定了 ID 字段的值。例如,

-- 错误的插入方法
INSERT INTO TBL_USER_CARD values(100, 0, 'charies', 'IQ_CARD'); 

如上面所示,此为错误的插入方式,错误的原因就在于我们设置了 ID 的值。

3 解决方法

既然我们已经知道了此错误发生的原因,那么修改就简单多了,方法有两种:

  • 第 1 种:修改建表语句,为
CREATE TABLE TBL_USER_CARD (
    ID BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY,
    VERSION INTEGER,
    USER_NAME VARCHAR(126) NOT NULL,
    CARD_NAME VARCHAR(16) NOT NULL,
    PRIMARY KEY (ID)
);
  • 第 2 种:插入数据时,将 ID 的值设置为default,例如
-- 正确的插入方法
INSERT INTO TBL_USER_CARD values(default, 0, 'charies', 'IQ_CARD'); 

如上所述,此两种方法都可以解决此错误,二者择一即可。

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

DB2的SQLCODE和SQLState相关解释

操作数据库过程中,遇到许多问题,很多都与SQL CODE和SQL State相关,现在把一个完整的SQLCODE和SQLState错误信息和相关解释作以下说明,一来可以自己参考,对DB2错误自行找出原...
  • gabriel_lucky
  • gabriel_lucky
  • 2013-04-08 17:10
  • 8348

数据类型不匹配(SQLCODE=-245)

@Override public List getHoliday(String day) { List list = new ArrayList(); Map params = new Ha...
  • calance
  • calance
  • 2016-02-17 15:30
  • 2394

DB2的SQLCODE和SQLState相关解释

SQLCODE=-911, SQLSTATE=40001 错误的原因:是在执行update语句的时候发生了死锁 SQLCODE=-911, SQLSTATE=40001 解决方法: ---...
  • mei6012006
  • mei6012006
  • 2013-04-01 09:34
  • 4027

DB2 SQL error: SQLCODE: -968, SQLSTATE: 57011, SQLERRMC: null

报这个错的原因是DB2数据库的日志满了,需要修改数据库日志的参数。
  • donghaile
  • donghaile
  • 2014-05-15 15:30
  • 4304

sqlcode sqlstate DB2错误信息(按sqlcode排序) SQL 错误码

000 00000 SQL语句成功完成 01xxx SQL语句成功完成,但是有警告 +012 01545 未限定的列名被解释为一个有相互关系的引用 +098 01568 动态SQL语句用分...
  • liyanhui1001
  • liyanhui1001
  • 2012-07-20 10:43
  • 1989

DB2的SQLCODE和SQLState相关解释

操作数据库过程中,遇到许多问题,很多都与SQL CODE和SQL State相关,现在把一个完整的SQLCODE和SQLState错误信息和相关解释作以下说明,一来可以自己参考,对DB2错误自行找出原...
  • I_am_xiaoQ
  • I_am_xiaoQ
  • 2012-05-25 19:58
  • 3570

DB2-407报错中如何快速定位问题 SQLCODE: -407, SQLSTATE: 23502

SQLCODE: -407, SQLSTATE: 23502:这个报错的准确描述是这样的,不能把NULL值插入到定义为NOT NULL的列中。也就是违反了完整性约束异常。 在开发中,这个报错,我们会...
  • reggergdsg
  • reggergdsg
  • 2017-08-02 15:54
  • 4950

烦:DB2 V9.5 ERRORS:[encoding not supported]/[SQLCODE=-104, SQLSTATE=42601]

DB2    V9.5 经常出现以下异常,都是因为DB2的驱动包版本问题,大家碰到子类问题可以首先考虑驱动包版本的原因。 驱动包:db2java.jar         db2jcc.ja...
  • MCpang
  • MCpang
  • 2012-09-13 17:15
  • 9670

db2数据库错误解决代码sqlcode

  • 2009-05-25 13:17
  • 183KB
  • 下载

DB2 sqlcode sqlstate 说明

  • 2010-09-16 17:55
  • 73KB
  • 下载
    个人资料
    • 访问:812688次
    • 积分:11850
    • 等级:
    • 排名:第1471名
    • 原创:257篇
    • 转载:85篇
    • 译文:11篇
    • 评论:892条
    博主的 GitHub 账号
    GitHub : Charies Gavin

        鉴于 CSDN 糟糕的用户体验,博主会将一些优质的文章迁移到 Charies Gavin's Blog  欢迎大家在 GitHub 上 Follow 博主,以及 Fork、Star、Watch 博主的项目。


      青春不老 奋斗不止


      好学若饥虚心若愚
    博客专栏