替换为不影响任何行

时间:2018-09-06 12:50:20

标签: java mysql

我有以下代码:

manager.prepareStatement("REPLACE INTO `players` SELECT `id`, `uuid`, ?, ?, `date`"
                + " FROM `players` WHERE `uuid` = ? AND `date` = ?;");
        manager.addString(1, ...);
        manager.addString(2, ...);
        manager.addString(3, uuid.toString());
        manager.addLong(4, ...);
        logger.debug("Updated " + manager.update() + " rows");
        manager.commit();
        manager.closeStatement();

我之前也做过以下事情:

ALTER TABLE `players` ADD CONSTRAINT `uuid_date` UNIQUE ( `uuid`, `date` );
如果找到现有行,则

REPLACE INTO应该替换,否则插入。我希望这将始终影响至少1行。但是,由于某种原因,什么也没发生,它告诉我0行受到影响。这怎么可能?

编辑:我使用了Like this。我认为问题在于,如果SELECT找不到任何内容,它将不会插入,但是我该如何解决?

注意:manager是我用来处理异常的自定义类的实例。

1 个答案:

答案 0 :(得分:-1)

这是preparedstatement的正确用法:

@Override
public long write(Connection con) throws SQLException {
    Gson gson = new Gson();
    String batchQuery = "INSERT INTO " + ResultSchema.ID.getTableName() +
            " (" + ResultSchema.URL.getColumnName() + "," +
            ResultSchema.SE_TITLE.getColumnName() +
            ") VALUES (?,?)";
    PreparedStatement preparedStatement = con.prepareStatement(batchQuery);

    preparedStatement.setString(1, this.getUrl());
    preparedStatement.setString(2, this.getSeTitle());
    preparedStatement.addBatch();

    return preparedStatement.executeBatch()[0];
}

您应该调用execute或executeBatch将查询应用于数据库。