Sqlite 具有已准备语句的事务失败

Sqlite 具有已准备语句的事务失败,sqlite,jdbc,transactions,Sqlite,Jdbc,Transactions,我尝试将交易与准备好的报表一起使用,以便更新表库存,其中: CREATE TABLE "INVENTORY" ( "product" VARCHAR NOT NULL, "version" VARCHAR NOT NULL, "lot" VARCHAR, "barcode" VARCHAR, "quantity" INTEGER, PRIMARY KEY ("barcode") ); 我想做的是插入一个新行,但是如果在我的表中存在一个具有相同主

我尝试将
交易
准备好的报表
一起使用,以便更新表
库存
,其中:

CREATE TABLE "INVENTORY" (
    "product" VARCHAR NOT NULL,
    "version" VARCHAR NOT NULL,
    "lot" VARCHAR,
    "barcode" VARCHAR,
    "quantity" INTEGER,

    PRIMARY KEY ("barcode")
);
我想做的是插入一个新行,但是如果在我的表中存在一个具有相同主键的行,那么可以通过添加旧值+新值来更新它

我读了很多书,我想我是正确地按照说明做的

String sqInsert = "INSERT INTO INVENTORY VALUES ('100541026044','01','301610101','10054102604401301610101','5000')";
String sqUpdate = "UPDATE INVENTORY set quantity = quantity + 5000 where barcode='10054102604401301610101'";

// transaction block start   
c.setAutoCommit(false);         

stm = c.prepareStatement(sqInsert);    
System.out.println("try to insert");
result = stm.executeUpdate();

System.out.println("try to update");
stm = c.prepareStatement(sqUpdate);
result = stm.executeUpdate();

c.commit(); //transaction block end
System.out.println("Done!");
在我的表中,存在一行
条码=10054102604401301610101
,因此我希望执行更新。然而,我明白了

try to insert
Error inserting products :[SQLITE_CONSTRAINT]  Abort due to constraint violation (UNIQUE constraint failed: INVENTORY.barcode)

注意:(我不从查询中设置值,但使用
stm.setString(1,“字符串”);
)我只想在这里缩短代码

当然,由于条形码上的主键重复,它将失败。 首先进行更新

stm = c.prepareStatement(sqUpdate);
result = stm.executeUpdate();
然后检查result的值,该值将是受更新影响的行数。如果为零,则具有给定条形码的产品不存在,因此在更新后,请执行以下操作:

if (0==result) {
    stm = c.prepareStatement(sqInsert);    
    stm.executeUpdate();
}
您需要将所有内容置于try{}catch{}下,以避免资源泄漏或使连接无法使用

try {
    c.setAutoCommit(false);
    stm = c.prepareStatement(sqUpdate);
    result = stm.executeUpdate();
    if (0==result) {
        stm.close();
        stm = null;
        stm = c.prepareStatement(sqInsert);    
        stm.executeUpdate();
        stm.close();
        stm = null;
    }
    c.commit();
} catch (SQLException e) {
    if (stm!=null) stm.close();
    c.rollback();
}

当然,由于条形码上的主键重复,它将失败。 首先进行更新

stm = c.prepareStatement(sqUpdate);
result = stm.executeUpdate();
然后检查result的值,该值将是受更新影响的行数。如果为零,则具有给定条形码的产品不存在,因此在更新后,请执行以下操作:

if (0==result) {
    stm = c.prepareStatement(sqInsert);    
    stm.executeUpdate();
}
您需要将所有内容置于try{}catch{}下,以避免资源泄漏或使连接无法使用

try {
    c.setAutoCommit(false);
    stm = c.prepareStatement(sqUpdate);
    result = stm.executeUpdate();
    if (0==result) {
        stm.close();
        stm = null;
        stm = c.prepareStatement(sqInsert);    
        stm.executeUpdate();
        stm.close();
        stm = null;
    }
    c.commit();
} catch (SQLException e) {
    if (stm!=null) stm.close();
    c.rollback();
}

您正在执行插入和更新。(如果插入成功,则更新新行。)您需要一个if/else@CL。您确定两个查询都已执行吗?如果是,为什么我没有在控制台中获得消息
尝试更新
?我先是在更新中反转了查询,然后是插入,结果成功了。您正在执行插入和更新。(如果插入成功,则更新新行。)您需要一个if/else@CL。您确定两个查询都已执行吗?如果是,为什么我没有在控制台中获得消息
尝试更新
?我先是在更新中反转了查询,然后是插入,结果成功了。。