java jdbc插入外键上的键主要重复条目

时间:2014-06-11 09:02:34

标签: mysql jdbc foreign-keys insert-update duplicates

“重复'主要'的重复条目”似乎是互联网上的一个热门问题,即使我没有找到与我的问题相关的帖子。我正在尝试使用java jdbc将值插入表中,但不知怎的,我得到了这个“主要”键问题。

相关代码如下:

preparedStatement = connect
              .prepareStatement("insert into database1.table2 values (default, ?, ?));
          preparedStatement.setString(1, randomString(12)); // Inserts a normal String, tested & working
          insert_plz(plz); // Inserts a given value as a primary key into table1
          preparedStatement.setInt(2, plz); // Inserts that value as a foreign key 
          preparedStatement.executeUpdate(); // Exception is thrown here

调用函数insert_plz(plz)没有任何问题,我检查了数据库。

这就是我创建table2的方式:

create table table2 (
standorte_schluessel int unsigned auto_increment,
name varchar (20) not null,    
postleitzahl int unsigned,
primary key (standorte_schluessel),
foreign key (postleitzahl) references plz (postleitzahl) on delete cascade
);

现在我的问题是,为什么在尝试插入外键时,它会给我一个主键错误?

另外,我是mysql的新手(虽然不是java),所以我的问题的答案可能很明显(遗憾的是不是我)。

这是错误日志:

Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '74141' for key 'PRIMARY'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:408)
at com.mysql.jdbc.Util.getInstance(Util.java:383)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1049)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4226)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4158)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2840)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2082)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2334)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2262)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2246)
at Connect.insert_standort(Connect.java:113)
at Connect.readDataBase(Connect.java:41)
at Main.main(Main.java:5)

1 个答案:

答案 0 :(得分:2)

您应该明确指定列并使用以下插入查询:

insert into database1.table2(name, postleitzahl) values (?, ?)

请参阅Using AUTO_INCREMENT

我不是百分百肯定,但我怀疑在id列的位置使用DEFAULT可能会插入当前的自动增量值,而不是下一个自动增量。