Java 如果insert语句出现重复键异常(表中的行id=1),如何在JDBC(Postgresql)中更新该语句

Java 如果insert语句出现重复键异常(表中的行id=1),如何在JDBC(Postgresql)中更新该语句,java,postgresql,jdbc,arraylist,Java,Postgresql,Jdbc,Arraylist,我在ArrayList.com中存储了大量insert语句,如下所示 List<String> script=new ArrayList<String>; script.add("INSERT INTO PUBLIC.EMPLOYEE(ID, NAME) VALUES (1, 'Madhava')); script.add(INSERT INTO PUBLIC.EMPLOYEE(ID, NAME) VALUES (2, 'Rao')); script.add(INSERT

我在ArrayList.com中存储了大量insert语句,如下所示

List<String> script=new ArrayList<String>;
script.add("INSERT INTO PUBLIC.EMPLOYEE(ID, NAME) VALUES (1, 'Madhava'));
script.add(INSERT INTO PUBLIC.EMPLOYEE(ID, NAME) VALUES (2, 'Rao'));
script.add(INSERT INTO PUBLIC.ADDRESS(ID, CITY) VALUES(1, 'Bangalore'))
script.add(INSERT INTO PUBLIC.ADDRESS(ID, CITY) VALUES(2, 'Hyd'));
try{
        Connection con=DBConnections.getPostgresConnection();
         Statment statment=con.createStatment();
        for(String query:script){
           executeUpdate(query);
        }
    }catch(Exception e){
     e.printStackTrace();
    }
如果我得到复制密钥异常(即postgresDB中已经存在记录)

如何使用update查询将同一状态(记录)更新到Postgres中。 有什么办法解决这个问题吗? 有没有其他更好的方法来解决这个问题?
请您解释一下……

执行更新会将DML语句发送到数据库。您的数据库必须已有一条记录,该记录使用employees或address表中的主键之一

您必须确保不违反主键约束。违反约束将导致异常


将查询更改为update语句,或删除导致冲突的记录。

执行update将DML语句发送到数据库。您的数据库必须已有一条记录,该记录使用employees或address表中的主键之一

您必须确保不违反主键约束。违反约束将导致异常


要么将查询更改为update语句,要么删除导致冲突的记录。

无法获取导致异常的密钥(尽管您可能可以解析错误消息,这当然不推荐)

相反,你应该努力防止这种情况发生。至少有3种简单的方法可以实现这一点

  • 使数据库更新列

    (in Postgresql you should use a serial type (which is basically an int data type)
    CREATE TABLE employee
    (
     id serial NOT NULL,
     --other columns here )
    
  • 您的插入现在看起来像

       script.add("INSERT INTO PUBLIC.EMPLOYEE(NAME) VALUES ('Madhava'));//no ID here
    
  • 创建一个序列,让JDBC代码调用序列的nexval方法

    script.add("INSERT INTO PUBLIC.EMPLOYEE(ID, NAME) VALUES (YOUR_SEQ_NAME.NEXTVAL(), 'Madhava'));
    
  • 在Java中创建唯一ID(最不推荐)


  • 无法获取导致异常的密钥(尽管您可能可以解析错误消息,这当然不推荐)

    相反,你应该努力防止这种情况发生。至少有3种简单的方法可以实现这一点

  • 使数据库更新列

    (in Postgresql you should use a serial type (which is basically an int data type)
    CREATE TABLE employee
    (
     id serial NOT NULL,
     --other columns here )
    
  • 您的插入现在看起来像

       script.add("INSERT INTO PUBLIC.EMPLOYEE(NAME) VALUES ('Madhava'));//no ID here
    
  • 创建一个序列,让JDBC代码调用序列的nexval方法

    script.add("INSERT INTO PUBLIC.EMPLOYEE(ID, NAME) VALUES (YOUR_SEQ_NAME.NEXTVAL(), 'Madhava'));
    
  • 在Java中创建唯一ID(最不推荐)


  • 您可以使用
    insert on conflict…
    解决此问题的方法是更新是否存在密钥或使用自动生成的密钥;最好有一个对象列表,传递给PreparedStatement并对数据库执行。您可以使用
    insert on conflict…
    解决此问题的方法是更新是否存在键或使用自动生成的键。不要认为您应该有一个插入列表;最好有一个对象列表,传递给PreparedStatement并对数据库执行。