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

1 错误描述

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

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'); 

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

MySQL Profile在5.7的简单测试(r10笔记第50天)

MySQL Profile对于分析执行计划的开销来说,还是有一定的帮助,至少在分析一些性能问题的时候有很多的参考依据。 我在5.6, 5.7版本中进行了测试,没...

3195
来自专栏杨建荣的学习笔记

MySQL和Oracle的添加字段的处理差别 (r10笔记第73天)

昨天在微信群中有个朋友也是无意中问了一下,说数据库中的表字段想保持一种相对规范的顺序,怎么办?要知道Oracle中这个操作就比较纠结了,因为是按照追加的方式来处...

3536
来自专栏数据库

oracle常用命令大全

一、Oracle数据库实例、用户、目录及session会话查看: 1、ORACLE SID查看设置 查看SID、用户名 $ env|grep SID 、sele...

4187
来自专栏腾讯云Elasticsearch Service

mysql数据实时同步到Elasticsearch

业务需要把mysql的数据实时同步到ES,实现低延迟的检索到ES中的数据或者进行其它数据分析处理。本文给出以同步mysql binlog的方式实时同步数据到ES...

3.5K7
来自专栏数据和云

深入解析:你听说过Oracle数据库的更新重启动吗?

杨廷琨 云和恩墨高级咨询顾问, ITPUB Oracle 数据库管理版版主 ,人称 “杨长老”,十数年如一日坚持进行 Oracle 技术研究与写作,号称 ...

924
来自专栏PHP在线

Mysql存储引擎中InnoDB与Myisam的区别

1. 事务处理innodb 支持事务功能,myisam 不支持。 Myisam 的执行速度更快,性能更好。 2. select ,update ,insert...

3095
来自专栏乐沙弥的世界

临时表空间的管理与受损恢复

      Oracle 临时表空间是Oracle数据库的重要组成部分,尽管该部分并没有cont体系结构上得以展现,但其重要地位也是不容忽视的。尤其是 对于大...

1103
来自专栏乐沙弥的世界

Oracle 用户、对象权限、系统权限

用户:对数据库的访问,需要以适当用户身份通过验证,并具有相关权限来完成一系列动作

1152
来自专栏Jerry的SAP技术分享

在ABAP里取得一个数据库表记录数的两种方法

这个函数使用起来很简单,只需要将想查询的数据库表名称维护进输入参数IT_TABLES:

1555
来自专栏杨建荣的学习笔记

闪回归档的简单测试(r8笔记第68天)

11g里面的新特性闪回归档,为历史数据的定制查询提供了一种可能。抽时间学习了一下这个特性,发现还是比较清晰易用。如果使用得当还是很不错的一个特性。 我们来简单模...

3225

扫码关注云+社区