使用WHERE NOT EXISTS与虚拟表无法在Apache Derby数据库上运行

时间:2012-01-09 12:44:09

标签: java sql derby not-exists

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

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

并且它似乎正在工作,但是当我多线程化代码以便两个线程可能尝试插入相同的图形时,我得到关于将重复值输入索引的获取错误。

如果我同步方法,以便只有一个线程可以同时调用该方法,那么我没有得到这样的错误,但这首先打败了添加WHERE NOT EXISTS值的目的。

我的查询是不是在做我认为它正在做的事情,还是我在这里误解了一般概念?

1 个答案:

答案 0 :(得分:0)

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

我自己还没有获得过这个产品,但是如果你优化子查询,我猜你可以绕过它。 像这样(我没有测试过,也许它需要改进):

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