在非常简单的表上运行以下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_relational
。runs
,CONSTRAINT runs_ibfk_1
FOREIGN KEY( sample_id
)参考samples
(id
))
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)
答案 0 :(得分:2)
没有足够的代表发表评论,我很害怕。也许这可能算作答案了:
您的问题已标记为mysql
,但您没有明确说明所使用的编程语言;显然它是Java。 AFAIK Java异步工作,即引擎在执行下一个之前不等待语句完成。在这种情况下,它意味着在MySQL引擎完成之前将触发第二个DELETE语句(在samples
表上)删除所有runs
。在第一个回调中触发第二个DELETE将避免此问题,或任何其他方法来同步这两个语句。不知道你是怎么做的,我不是Java程序员。其他人可能会帮助你。
答案 1 :(得分:0)
检查您的触发器 OnDelete。可能您在删除后尝试添加新记录并出现密钥重复错误