java 主键重复处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 主键重复处理相关的知识,希望对你有一定的参考价值。

我想往数据库里批量插入数据(oracle),其中中间一条数据在数据库中已经存在,故会引发主键重复的错误,我想放过这个错误,将剩余的数据继续插入到数据库中。
问题点:
java中怎么判断oracle返回来的错误码就是主键重复(一意制约)的错误。怎么判断是重点,还望高手不吝赐教。谢谢
谢谢两位的解答,“a duplicate key value in a unique or primary key ”我不是为了看这个。我个人知道什么一意制约,我的意思是让程序知道。
我批量插入数据是有用的,不要考虑完整性,重复的数据就没有必要再插入一次了,所有我插入数据完后不会再去处理重复数据了。
还有就是,我在插入前查询数据是否存在,这个方法不太好了,一:我大量的插入,所有要不断的检索数据,故性能就会受到影响。二:就算性能不考虑,多用户同时操作,你刚检索的结果没有这条数据,当你插入的时候,别的用户已经插入了本条数据,故行不通的。加锁是能解决,性能问题会更加突出。
还是要谢谢两位的回答。我的问题已经解决了。因为我的开发环境把所有的java基类都包了一层,故我当一意制约时我取不到一些我想要的值,经过研究还是把想要的值搞到了。谢谢两位了。

据我所知没有专门的捕获主键的异常
你可以
try
catch(exception
ex)
ex.printstacktrace();

捕获异常之后,会在控制台打印你所捕获异常的信息。如果你只想捕获主键异常的话,可以把打印出来的主键异常名称来替换exception.
其实效果是一样的。。。
参考技术A 主键重复的话,常见使用方法:
方法一:建议可以用uuid形式(此形式生成的32位字符串永远不会重复)。
import java.util.UUID;
public class Test
public static void main(String[] args)
UUID uuid = UUID.randomUUID();
System.out.println (uuid);

方法二:将主键中添加与时间相关内容。因为时间用永远不会重复。
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String str = sdf.format(date1);
System.out.println(str);
参考技术B 主键重复的异常应该很容易看出来,具体怎么说的忘了 反正类似:a duplicate key value in a unique or primary key 这个。
你把oracle报的错误代码 放上百度一查就知道是什么原因出错了。
参考技术C 你只是为了判断主键重复吗?批量插入这种开启事务的操作,出错时就应该回滚的。你要继续插入,那这个批次的数据就不完整了吧。难道你是想在批次插入完成后再对重复主键的纪录进行处理???

那样的话你还不如在插入数据前,查询纪录是否存在,不存在时插入,存在时你可以进行忽略这条记录或主键修改后再插入等操作。依靠判断异常的情况不可取

希望能对你有所帮助本回答被提问者采纳

SQL java获取分配给自动递增主键的值[重复]

【中文标题】SQL java获取分配给自动递增主键的值[重复]【英文标题】:SQL java get value assigned to auto increment primary key [duplicate] 【发布时间】:2011-02-20 15:17:24 【问题描述】:

我的表中有一个主键自动递增属性。我想知道为使用 statement.executeUpdate() 插入的行分配的值。如何以最佳方式实现这一目标?

【问题讨论】:

对于什么数据库?您可以对 Oracle/DB2(可能还有 Postgres)使用 RETURNING 子句; MySQL 的 LAST_INSERT_ID; @SCOPE_IDENTITY 用于 SQL Server... @OMGPonies:JDBC 抽象了数据库实现这一点的方式(当数据库支持时)。 【参考方案1】:

使用Statement#getGeneratedKeys()Statement#executeUpdate(String, int)(这是 JDBC 3.0 功能,您的数据库必须支持 JDBC 3.0)。

这是一个返回 ResultSet 的示例,其中包含 TABLE1 中自动生成的列的值:

Statement stmt = conn.createStatement();
int rows = stmt.executeUpdate("INSERT INTO TABLE1 (C11, C12) VALUES (1,1)", Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();

【讨论】:

我在调用 rs.getInt("id"); 时收到一条错误消息,提示找不到列 ID可能是什么原因? 相关的东西。 bugs.mysql.com/bug.php?id=18409 但即使这样也不能解决问题 我的列的数据类型为 int(11)。我正在使用 mysql @iamrohitbanga 您是否尝试通过索引rs.getInt(1); 检索列? 是的,我做到了。我仍然有一个例外。我在这里发布了一个新问题。 ***.com/questions/2854774/…

以上是关于java 主键重复处理的主要内容,如果未能解决你的问题,请参考以下文章

Clickhouse重复数据处理

SQL java获取分配给自动递增主键的值[重复]

MySQL处理重复数据和SQL 注入

SQL 插入语句要求主键输入不能重复不能为空 sql语句怎么写

JAVA JDK提供的一个自动生成主键 UUID.randomUUID()的方法 它永远都不会重复嘛??

雷林鹏分享:MySQL 处理重复数据