通过JSP增量主键在JAVA中插入PostgreSQL

时间:2017-03-30 19:49:13

标签: java mysql postgresql jsp jdbc

我正在编写一个JSP应用程序,用户输入食物项目并将其输入PostgreSQL数据库。当用户手动输入下一个主键时,我没有遇到任何问题,但我删除了此功能,以便在单击输入按钮时自动分配主键。我希望查询获取当前最大FID(食物ID)并将新食物项目的FID设置为前一个+ 1.

try {

    conn = ConnectionProvider.getCon();
    String sql = "select fid from project.food order by fid desc limit 1";
    pst = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
    status = pst.getResultSetType();
    f.setFood_id(status + 1);

    pst = conn.prepareStatement("insert into project.food values(?,?,?,?,?,?)");
    pst.setInt(1, f.getFood_id());
    pst.setString(2, f.getFood_name()); //set name
    pst.setInt(3, f.getCount()); //set count
    pst.setInt(4, f.getPrice_per_item()); //set price
    pst.setInt(5, f.getThreshold()); //set threshold
    pst.setString(6, "false");
    status = pst.executeUpdate();
    conn.close();
    pst.close();
} catch (Exception ex) {
    System.out.println(ex);
}
return status;
}

第一个食品项目成功地插入到第1006行的数据库中,而不是第7行,这是数据库中第一个可用的。此外,第二个插入失败是由于主键失败而增加1.程序再次尝试将下一个元组插入同一行,从而违反了主键约束。

    org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "food_pkey"
    Detail: Key (fid)=(1006) already exists.

1 个答案:

答案 0 :(得分:1)

通过声明SERIAL数据类型(基本上是自动递增INT)在数据库中进行主键自动增量,这样就会创建一个序列来自动为其赋值。

然后转换您的update语句以指定除主键之外的所有列(即insert into project.food(foo, bar, baz) values (?, ?, ?)),并删除一个?占位符和pst.setInt(1,f.getFood_id());行。这将向所有列插入值其他列,主键将由数据库生成。

这样你就不需要在想要插入时进行选择(无论如何这都是一个非常糟糕的主意),并且你让数据库做它最擅长的事情。在此之后,您无需关心主键的值。