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

通过JSP递增主键在JAVA中插入PostgreSQL,java,mysql,postgresql,jsp,jdbc,Java,Mysql,Postgresql,Jsp,Jdbc,我正在编写一个JSP应用程序,其中用户输入一种食物,然后将其输入到PostgreSQL数据库中。当用户必须手动输入下一个主键时,我在实现这一点上没有问题,但我删除了此功能,以便在单击enter按钮时自动分配主键。我希望查询获取当前最大FID食品ID,并将新食品的FID设置为前一个+1 try { conn = ConnectionProvider.getCon(); String sql = "select fid from project.food order by fid

我正在编写一个JSP应用程序,其中用户输入一种食物,然后将其输入到PostgreSQL数据库中。当用户必须手动输入下一个主键时,我在实现这一点上没有问题,但我删除了此功能,以便在单击enter按钮时自动分配主键。我希望查询获取当前最大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.

通过将主键声明为串行数据类型(基本上是自动递增的INT),使主键在数据库中自动递增,以便创建一个序列来自动为其赋值

然后转换update语句以指定主键以外的所有列,即插入到project.foodfoo、bar、baz值?、?、?中,然后删除一个?占位符和pst.setInt1,f.getFood_id;线这将向所有其他列插入值,并且主键将由数据库生成


这样,当您想插入时,就不需要执行select操作,这是一个非常糟糕的主意,而且您可以让数据库做它最擅长的事情。在此之后,您无需关心主键的值。

感谢您的回复。我最初确实按照您提到的那样将其设置为串行,但问题是我想使用SQL语句将食物项批量添加到食物表中,以用于测试程序。当用户从JSP页面添加时,串行增量尝试从1开始,我再次遇到相同的问题。我发现了使用串行实现表的错误之处,可以使用您建议的相同符号手动向表中添加内容。当我通过我创建的insert JSP页面尝试时,我遇到了一个无法识别的错误:org.postgresql.util.PSQLException:错误:列fid的类型为integer,但表达式的类型为character Variable提示:您需要重写或强制转换表达式。位置:33从JSP页面插入不会使串行复位。它是由数据库控制的,所以除非您显式地为它赋值,而不是将它排除在insert语句之外,否则Java对此没有任何说明。基于您的异常,您仍然试图显式地为主键赋值,而不是让Postgres为您赋值。谢谢!解决了的。不小心弄乱了列的值。