从表

时间:2015-12-06 19:07:04

标签: mysql

在非常简单的表上运行以下sql语句时,我收到以下错误。此处使用的唯一外键位于表runs中,外键为runs.sample_id,引用samples.id。我不知道为什么我收到此错误,因为我试图删除所有运行,然后删除它们所依赖的样本。代码如下:

java代码:

String deleteRunsQuery =“DELETE FROM runs”; //从运行表中删除行   String deleteSamplesQuery =“DELETE FROM samples”; //从样本表中删除行

stmt.executeUpdate(deleteRunsQuery);

stmt.executeUpdate(deleteSamplesQuery);

和例外:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败(gc_image_relationalruns,CONSTRAINT runs_ibfk_1 FOREIGN KEY( sample_id)参考samplesid)) 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) 在com.mysql.jdbc.Util.handleNewInstance(Util.java:400) 在com.mysql.jdbc.Util.getInstance(Util.java:383) 在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:973) 在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3847) 在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3783) 在com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2447) 在com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2594) 在com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2541) 在com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1604) 在com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1535) at com.gcimage.relational.RelationalDatabaseTest.disposeDb(RelationalDatabaseTest.java:40)

2 个答案:

答案 0 :(得分:2)

没有足够的代表发表评论,我很害怕。也许这可能算作答案了:

您的问题已标记为mysql,但您没有明确说明所使用的编程语言;显然它是Java。 AFAIK Java异步工作,即引擎在执行下一个之前不等待语句完成。在这种情况下,它意味着在MySQL引擎完成之前将触发第二个DELETE语句(在samples表上)删除所有runs。在第一个回调中触发第二个DELETE将避免此问题,或任何其他方法来同步这两个语句。不知道你是怎么做的,我不是Java程序员。其他人可能会帮助你。

答案 1 :(得分:0)

检查您的触发器 OnDelete。可能您在删除后尝试添加新记录并出现密钥重复错误