从我的代码(Java)中,我想确保在我的代码执行后数据库(DB2)中存在一行。
我的代码现在执行 select
如果没有返回结果,它执行 insert
。我真的不喜欢这段代码,因为它让我在多线程环境中运行时遇到并发问题。
我想做的是将这个逻辑放在 DB2 中,而不是放在我的 Java 代码中。 DB2 是否有 insert-or-update
语句?或者我可以使用的任何类似的东西?
例如:
insertupdate into mytable values ('myid')
另一种方法可能是始终执行插入并捕获“SQL-code -803 主键已经存在”,但如果可能的话,我想避免这种情况。
原文由 Mikael Eriksson 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用
Merge
语句,如下所示:假设您使用的是本 答案 中提到的 DB2 Linux/Unix/Windows (LUW)。
提到的原始问题
Java
,为了方便起见,我编写了一些代码来生成带有参数标记的 SQL 字符串PreparedStatement
。 (这需要LUW 9.7
或以上链接 答案 中提到的更新版本。)如果您正在制作原型,经常更改数据库表等,您可能会发现它很有用……因为您将不得不重写更少的代码。此示例代码:
将生成以下 SQL 语句:
然后在创建
PreparedStatement
时将此 SQL 用作输入参数。下面是代码,它可能会写得更干净,但我相信它的文档足够好,可以按原样理解。
希望你会发现它和我一样有用。