0

私はこのようなテーブルを持っています:

Table A:  
`id | name`

Table B:  
`id | A_id | ....`  

A_id is a foreign key to Table A, the Engine is InnoDB

これは失敗するコードです:

    String[] cleanupQueries = new String[] { "DELETE FROM B WHERE A_id = (SELECT id FROM A WHERE name = 'test')",
                                            "DELETE FROM A WHERE name = 'test'" };

    Connection connection;
    try {
        connection = DriverManager.getConnection(getConnectionString());
        connection.setAutoCommit(false);
    } catch (SQLException e) {
        throw new RuntimeException("Error establishing a database connection!");
    }

    try {
        for(String cleanupQuery : cleanupQueries) {
            PreparedStatement statement = connection.prepareStatement(cleanupQuery);
            statement.executeUpdate(); //FAILS WHEN EXECUTING THE SECOND QUERY
        }
    } catch(SQLException e) {
        throw new RuntimeException("Error while executing the queries in the transactional context!");
    }

    try {
        connection.commit();
    } catch (SQLException e) {
        rollback(connection);
        throw new RuntimeException("Error while comitting!");
    }

私が得る例外は次のとおりです。 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails ('DATABASE/TABLE', CONSTRAINT 'FK_B_A' FOREIGN KEY ('FK_A') REFERENCES 'A' ('ID') ON DEL)

データベースでは、B がまだ残っているときに A を削除できませんが、最初のクエリですべての B が削除されました。すべての B とそれらが参照する A のみを完全に削除したい。

テーブルをカスケード削除に変更したくありません。コードを機能させるにはどうすればよいですか?

4

4 に答える 4

0

試す:

"DELETE FROM B WHERE A_id = (SELECT id FROM A WHERE name IN 'test')"
于 2012-10-29T13:12:46.477 に答える
0

外部キー制約を削除するときに、カスケードが true であることを追加するだけです。元の親エントリを削除すると、子テーブル エントリは自動的に削除されます。

于 2012-10-29T13:04:55.970 に答える
0

エラーの原因は

外部キーはテーブル A id を参照しているため、 F_Key を削除する場合は、まずその外部キーの子参照値を削除してから、親のみを削除する必要があります。

間違っていたら訂正して..

于 2012-10-29T12:51:45.457 に答える