Java 如果insert语句出现重复键异常(表中的行id=1),如何在JDBC(Postgresql)中更新该语句
我在ArrayList.com中存储了大量insert语句,如下所示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
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
script.add("INSERT INTO PUBLIC.EMPLOYEE(ID, NAME) VALUES (YOUR_SEQ_NAME.NEXTVAL(), 'Madhava'));
无法获取导致异常的密钥(尽管您可能可以解析错误消息,这当然不推荐) 相反,你应该努力防止这种情况发生。至少有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
script.add("INSERT INTO PUBLIC.EMPLOYEE(ID, NAME) VALUES (YOUR_SEQ_NAME.NEXTVAL(), 'Madhava'));
您可以使用
insert on conflict…
解决此问题的方法是更新是否存在密钥或使用自动生成的密钥;最好有一个对象列表,传递给PreparedStatement并对数据库执行。您可以使用insert on conflict…
解决此问题的方法是更新是否存在键或使用自动生成的键。不要认为您应该有一个插入列表;最好有一个对象列表,传递给PreparedStatement并对数据库执行。