Java 使用WHERE NOT EXISTS和不在ApacheDerby数据库上工作的虚拟表

Java 使用WHERE NOT EXISTS和不在ApacheDerby数据库上工作的虚拟表,java,sql,derby,not-exists,Java,Sql,Derby,Not Exists,因此,我在ApacheDerby中使用Java,并尝试插入一条记录,但仅当具有相同键的记录不存在时,因为我希望在代码中存在的所有值,而不是我使用Derby虚拟表(类似于db2的DUAL)的数据库,这是我使用的查询(md5是主键) 这似乎是可行的,但是当我对代码进行多线程处理,以便两个线程可以尝试插入相同的艺术品时,我得到了在索引中输入重复值的错误 如果我同步该方法,使同一时间只有一个线程可以调用该方法,那么就不会出现此类错误,但这会破坏首先添加WHERE NOT EXISTS值的目的 那么,是我

因此,我在ApacheDerby中使用Java,并尝试插入一条记录,但仅当具有相同键的记录不存在时,因为我希望在代码中存在的所有值,而不是我使用Derby虚拟表(类似于db2的DUAL)的数据库,这是我使用的查询(md5是主键)

这似乎是可行的,但是当我对代码进行多线程处理,以便两个线程可以尝试插入相同的艺术品时,我得到了在索引中输入重复值的错误

如果我同步该方法,使同一时间只有一个线程可以调用该方法,那么就不会出现此类错误,但这会破坏首先添加WHERE NOT EXISTS值的目的


那么,是我的查询没有达到我认为的效果,还是我误解了这里的一般概念?

信息:此解决方案不起作用。有关详细信息,请参见注释。我把它放在这里了,所以谁来寻找解决方案,谁也不必尝试这个

我自己还没有遇到过这个问题,但我想如果你用它优化子查询,你可以绕过它。 像这样(我还没有测试过,可能需要改进):


信息:此解决方案不起作用。有关详细信息,请参见注释。我把它放在这里了,所以谁来寻找解决方案,谁也不必尝试这个

我自己还没有遇到过这个问题,但我想如果你用它优化子查询,你可以绕过它。 像这样(我还没有测试过,可能需要改进):


你试过使用事务吗?不知道这有什么关系我不知道事务在这种情况下有什么帮助。对于OP:仅仅允许重复值错误发生并忽略它们有什么不对吗?它也可以达到同样的目的。从@soulcheck的角度来看,您可以通过使用事务来实现原子属性(前提是Derby完全可以序列化,这一点我不确定)。@user294896是的,但这可能会使用不充分的隔离级别(我不知道Derby中的默认值).你试过使用事务吗?不知道这有多大关系。我不知道事务在这种情况下会有什么帮助。对于OP:仅仅允许重复值错误发生并忽略它们有什么不对吗?它也可以达到同样的目的。从@soulcheck的角度来看,您可以通过使用事务来实现原子属性(前提是Derby完全可以序列化,这一点我不确定)。@user294896是的,但这可能会使用不充分的隔离级别(我不知道Derby中的默认值)嗨,谢谢。我刚试过,但没用。我想如果我理解了上面的评论,问题不是使用子查询,而是使用查询向insert提供数据,另外,该线程可以添加到第一个执行选择和基于选择执行插入的线程之间的行中。@user294896您是正确的,它与原始查询存在完全相同的问题。@user294896好的,我在回答中编辑了一条消息,将此回答标记为不工作。您好,谢谢您尝试了它,但它没有工作。我想如果我理解了上面的评论,问题不是使用子查询,而是使用查询向insert提供数据,该线程可以在第一个执行SELECT的线程和基于SELECT执行INSERT的线程之间添加一行。@user294896您是对的,它的问题与原始查询完全相同。@user294896好的,我在回答中编辑了一条消息,以将该回答标记为无效。
PreparedStatement stmt = conn.prepareStatement("INSERT INTO artwork (md5,image) " +
               "SELECT ?,?" +
               "FROM SYSIBM.SYSDUMMY1 " +
               "WHERE NOT EXISTS ( SELECT 1 FROM artwork WHERE md5=?)");

    stmt.setString(1, key);
    stmt.setBinaryStream(2, new ByteArrayInputStream(imageData), imageData.length);
    stmt.setString(3, key);
PreparedStatement stmt = conn.prepareStatement("INSERT INTO artwork (md5,image) " +
           "SELECT ?,?" +
           "FROM SYSIBM.SYSDUMMY1 left join artwork exi on ? = md5" +
           "WHERE exi.md5 IS NULL");

stmt.setString(1, key);
stmt.setBinaryStream(2, new ByteArrayInputStream(imageData), imageData.length);
stmt.setString(3, key);