我在这个问题上发现了很多差点错过。有很多类似但不太正确的方案。毫无疑问,我的无知会在这里闪耀。
使用DB2和一些知识,我的情况如下:
在表上,如果给定列中不存在给定值,则插入一行数据;如果存在该值,则更新对应的行。
我有桌子
id, bigint, not nullable
ref,varchar, nullable
Run Code Online (Sandbox Code Playgroud)
我不确定MERGE在这里是否正确,因为大多数示例和详尽的讨论似乎都围绕着将一张桌子合并到另一张桌子中。我只是收集用户输入并添加或更新它。似乎应该很简单。
我正在使用jdbc和准备好的语句来完成此操作。
MERGE是正确的方法吗?
在DB2 Control Center中测试查询时,我遇到了
“找不到用于FETCH,UPDATE或DELETE的行;或者查询结果为空表”
或其他各种错误,具体取决于我如何构造MERGE。这就是我目前所拥有的。
merge into table1 as t1
using (select id from table1 group by id) as t2
on t1.id = t2.id
when matched then update set t1.ref = 'abc'
when not matched then insert (t1.id, t1.ref) values (123, 'abc');
Run Code Online (Sandbox Code Playgroud)
如果我不是组成一个更新之后的插入 ; 对于新数据,插入将运行并且更新失败;对于现有数据,它们都将成功,从而导致表中的数据不正确,例如,两个相同的行。
期望的结果是在初次使用以下值时:
id = 1
ref = a
Run Code Online (Sandbox Code Playgroud)
添加新行。以后使用时,如果值更改为:
id = 1
ref = b
Run Code Online (Sandbox Code Playgroud)
id …
将db2jcc4.jar添加到系统类路径时,Tomcat 8.0在jar文件中引发FileNotFoundException,该jar文件没有明显引用我的项目pdq.jar。
除了通过搜索找到以下答案之外,我在系统上的任何位置或可能来自哪里都找不到它。
在这种情况下,我将我的CATALINA_HOME指向了C:\ tomcat8.0 \ apache-tomcat-8.0.41,并且我的项目定义了以下maven依赖项:
<dependency>
<groupId>com.ibm.db2.jcc</groupId>
<artifactId>db2jcc4</artifactId>
<version>10.1</version>
<scope>system</scope>
<systemPath>${env.CATALINA_HOME}/lib/db2jcc4-10.1.jar</systemPath>
</dependency>
Run Code Online (Sandbox Code Playgroud)