com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException

时间:2016-09-17 10:37:25

标签: java mysql jdbc

对不起,我对MySQL和java一般都很陌生。我试图研究其他人获得此例外的解决方案,但我找不到任何针对我的问题的解决方案。

如果我手动插入一个元组,它可以正常工作。但是,当我遍历文本文件并提取相关数据时,然后通过java将一个元组插入MySQL,我得到一个例外,声称一个重复的条目'但是,该条目在我的文本文件中只存在一次。

这是插入两个不同元组的示例:

insert into person (last_name, first_name, number, alias_value, has_alias) values ('Gleißner', 'A.', '0', 'g/AGleissner', 'YES');
insert into person (last_name, first_name, number, alias_value, has_alias) values ('Gleißner', 'Andreas', '0', '85/9125', 'NO');

其中last_name,first_name和number表示主键。

这是我的代码的片段:

    Connection myConn = DriverManager.getConnection(url, user, 
    Statement myStmt = myConn.createStatement();

虽然文本文件中的一行不为null:

String values = "" + "'" + lastName + "', '" + firstName + "', '" + Integer.toString(number) + "', '" + alias_value + "', '" + alias + "'"; 
String sq1 = "insert into person"
                            + " (last_name, first_name, number, alias_value, has_alias)"
                            + " values (" + values + ")";

myStmt.execute(sq1);

这是例外:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'Gleißner-A.-0' for key 'PRIMARY'
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
    at com.mysql.jdbc.Util.getInstance(Util.java:387)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:934)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3966)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3902)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2526)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2673)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2545)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2503)
    at com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl.java:839)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:739)
    at mySQLInsert.InsertPerson.main(InsertPerson.java:111)

编辑:

添加了显示如何加载数据的代码:

    BufferedReader br = new BufferedReader(new FileReader("author_ID.txt")); String person = "";
    while((person=br.readLine()) != null && person.length()!=0) 
    { //here I parse "person", and stored it into local variables within the while loop, then inserted the tuple using PreparedStatement}

临时(脏)解决方案: 我将Statement更改为PreparedStatement并包含ON DUPLICATE KEY UPDATE,以便在发生Exception时,使用相同的值更新元组:

String query = "INSERT INTO person"
                 + " (last_name, first_name, number, alias)(?,?,?,?)"
                 + " VALUES (?,?,?,?)"
                 + " ON DUPLICATE KEY UPDATE"
                 + " last_name=(?), first_name=(?), number=(?)" 
PreparedStatement myStmt = myConn.prepareStatement(query);

我认为因为SQL注入是动态的,所以insert命令会多次执行一组多个值的插入。如果我错了,请纠正我。

0 个答案:

没有答案