用于插入新数据和更新现有数据的DB2 SQL语句

用于插入新数据和更新现有数据的DB2 SQL语句,sql,db2,Sql,Db2,在这个问题上,我发现了很多未遂之处。这么多相似但不完全正确的场景。毫无疑问,我的无知将在这里闪耀 使用DB2和一些知识,我的场景如下: 如果给定列中不存在给定值,则在表上插入一行数据;如果值存在,则更新相应行 我有一张桌子 id, bigint, not nullable ref,varchar, nullable 我不确定这里的合并是否正确,因为大多数示例和深入的讨论似乎都围绕着将一个表合并到另一个表。我只是收集用户输入并添加或更新它。看起来应该很简单 我正在使用jdbc和准备好的语句来完成

在这个问题上,我发现了很多未遂之处。这么多相似但不完全正确的场景。毫无疑问,我的无知将在这里闪耀

使用DB2和一些知识,我的场景如下:

如果给定列中不存在给定值,则在表上插入一行数据;如果值存在,则更新相应行

我有一张桌子

id, bigint, not nullable
ref,varchar, nullable
我不确定这里的合并是否正确,因为大多数示例和深入的讨论似乎都围绕着将一个表合并到另一个表。我只是收集用户输入并添加或更新它。看起来应该很简单

我正在使用jdbc和准备好的语句来完成这项工作

合并是正确的方法吗

在DB2 Control Center中测试查询时,我遇到了

找不到用于获取、更新或删除的行;或 查询是空表“

或各种其他错误,具体取决于我构建合并的方式。这是我目前拥有的

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');
如果我改为编写一个更新,然后再编写一个插入;对于新数据,insert运行且更新失败;对于现有数据,insert和update都成功,导致表中出现错误数据,例如两个相同的行

如果在初次使用时使用以下值,则会得到理想的结果:

id = 1
ref = a
将添加一个新行。如果值更改为:

id = 1
ref = b
将更新id为1的行。后续使用将遵循相同的规则

请让我知道如何更好地表达这个问题


更新id不是自动递增键。它是一个唯一的外部键,但并不是所有我们引用的东西都需要我尝试更新的表中的相关行。此表本身是非结构化的,但它是更大数据模型的一部分

我对你的问题有点困惑。阅读课文让我怀疑你想要这样的东西:

merge into table1 as t1
using ( values (123, 'abc') ) as t2 (id, ref)
    on t1.id = t2.id
when matched then update 
    set t1.ref = t2.ref
when not matched then 
    insert (id, ref) values (t2.id, t2.ref);

这是正确的吗?

由于T2包含表1中的每个
id
,因此不清楚当不匹配时
条件如何可能出现。这就是给出错误的
MERGE
语句吗?假设ID是一个自动递增的主键,在插入过程中不应该传入它。此外,对于自动主键,还应定义另一个唯一键。如果您可以在其中插入“坏数据”,则表的定义不正确。@user2338816-这与查询不完全相同。为了便于阅读,我更改了表的名称,但它100%映射到了我实际使用的内容。我同意您的意见,并尝试更改on(条件)以与提供的id进行比较,但这也产生了异常结果。您所说的有道理,但因为它不起作用,我上面的问题是密切相关的:MERGE是处理这个用例的正确方法吗?是SQL0100W,SQLSTATE=02000吗?消息文本很有用,但实际的SQL消息Id和SQLSTATE要好得多。如果看不到实际的语句(除非示例语句给出相同的消息/状态并附带所有示例定义),那么一切都将是猜测,可能是无关的。还应该给出DB2版本/发行版和平台。这个问题已经回答了,但为了回答您的问题,SQLSTATE=02000是我一直尝试的方式。谢谢你的评论!这正是我需要的。非常感谢。从你的回答中我可以看出,我没有掌握这个结构的大部分用法!希望我也能给你们一些“拯救我的培根”投票。@Lennart它是如何添加table2值而不是行中的用户值的2@PraveenRKaruppannan,您的意思是从第二个表中选择值吗?@Lennart Yes!。你能帮我举个例子用
select id,ref从表2中替换
值(123,'abc')
,其中…