对不起,我对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命令会多次执行一组多个值的插入。如果我错了,请纠正我。