所以我在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值的目的。
我的查询是不是在做我认为它正在做的事情,还是我在这里误解了一般概念?
答案 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);