如果插入语句给出重复键异常(在表中找到行 id=1)如何更新 JDBC(Postgresql)中的语句

Posted

技术标签:

【中文标题】如果插入语句给出重复键异常(在表中找到行 id=1)如何更新 JDBC(Postgresql)中的语句【英文标题】:If insert statement gives duplicate key exception(row id=1 found in table) how to update the statement in JDBC(Postgresql) 【发布时间】:2016-02-18 18:59:19 【问题描述】:

我在 ArrayList.like 下面存储了一堆插入语句

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'));

我使用 jdbc 创建了到 postgresql 的连接,我使用下面的 for 循环执行了语句

try
        Connection con=DBConnections.getPostgresConnection();
         Statment statment=con.createStatment();
        for(String query:script)
           executeUpdate(query);
        
    catch(Exception e)
     e.printStackTrace();
    

如果我得到重复键异常(即 postgresDB 中已经存在记录)。

org.postgresql.util.PSQLException: ERROR: duplicate key value 
  violates unique constraint "reports_uniqueness_index"

如何使用更新查询将相同的语句(记录)更新到 Postgres。 有没有办法解决这个问题? 有没有其他更好的方法来解决这个问题? 你能解释一下吗...

【问题讨论】:

你可以使用insert on conflict ... 解决方法是如果存在密钥则更新或使用自动生成的密钥。 不要认为你应该有一个插入列表;最好有一个传递给 PreparedStatement 并针对数据库执行的对象列表。 【参考方案1】:

执行更新将 DML 语句发送到数据库。您的数据库必须已经有一条使用员工表或地址表中的主键之一的记录。

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

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

【讨论】:

【参考方案2】:

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

相反,您应该尝试防止这种情况发生。至少有 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(最不推荐)

    script.add("INSERT INTO PUBLIC.EMPLOYEE(ID, NAME) VALUES (UUID.random(), 'Madhava'));//or Math.random() etc
    

【讨论】:

以上是关于如果插入语句给出重复键异常(在表中找到行 id=1)如何更新 JDBC(Postgresql)中的语句的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句 存在就更新不存在就插入

为mysql中的每个查询结果在表中插入行[重复]

在表中插入行的副本并检查重复项

如果不存在,mysql插入不起作用创建重复键

使用 select 语句在表中插入

sql语句查询出的两行数据除了主键其他都一样,怎么去掉重复数据