2

因此,我将 Java 与 Apache Derby 一起使用,并且我正在尝试插入一条记录,但前提是不存在具有相同键的记录,因为我希望所有值都存在于我的代码而不是数据库中使用 derbys 虚拟表(类似于 DUAL for db2)这是我正在使用的查询(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 值的目的。

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

4

1 回答 1

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);
于 2012-01-09T16:16:43.730 回答