Проблема с foreign key, когда артист удаляет в java

Хорошие, я делаю программу, чтобы добавлять / удалять / изменять артисты базы данных, и когда я пробую удалять, артист отпускает это мне:

com.mysql.jdbc.exceptions.jdbc4. MySQLIntegrityConstraintViolationException: Cannot delete or update в parent row: в foreign key constraint fails (chinook.album, CONSTRAINT FK_AlbumArtistId FOREIGN KEY (ArtistId) REFERENCES artist (ArtistId) ON DELETE не ACTION ON UPDATE не ACTION) at sun.reflect. NativeConstructorAccessorImpl.newInstance0 (Нативе Метод) at sun.reflect. NativeConstructorAccessorImpl.newInstance (Ункнаун Соурсе) at sun.reflect. DelegatingConstructorAccessorImpl.newInstance (Ункнаун Соурсе) at java.lang.reflect. Constructor.newInstance (Ункнаун Соурсе) 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:932) at com.mysql.jdbc. MysqlIO.checkErrorPacket (MysqlIO.java:3878) at com.mysql.jdbc. MysqlIO.checkErrorPacket (MysqlIO.java:3814) at com.mysql.jdbc. MysqlIO.sendCommand (MysqlIO.java:2478) at com.mysql.jdbc. MysqlIO.sqlQueryDirect (MysqlIO.java:2625) at com.mysql.jdbc. ConnectionImpl.execSQL (ConnectionImpl.java:2551) at com.mysql.jdbc. PreparedStatement.executeInternal (PreparedStatement.java:1861) at com.mysql.jdbc. PreparedStatement.executeUpdateInternal (PreparedStatement.java:2073) at com.mysql.jdbc. PreparedStatement.executeUpdateInternal (PreparedStatement.java:2009) at com.mysql.jdbc. PreparedStatement.executeLargeUpdate (PreparedStatement.java:5094) at com.mysql.jdbc. PreparedStatement.executeUpdate (PreparedStatement.java:1994) at modelo.dao. ArtistaDAO.eliminarArtista (ArtistaDAO.java:103) at увиденная. VistaArtistasBuscar.actionPerformed (VistaArtistasBuscar.java:164) at javax.swing. AbstractButton.fireActionPerformed (Ункнаун Соурсе) at javax.swing. AbstractButton $Handler.actionPerformed (Ункнаун Соурсе) at javax.swing. DefaultButtonModel.fireActionPerformed (Ункнаун Соурсе) at javax.swing. DefaultButtonModel.setPressed (Ункнаун Соурсе) at javax.swing.plaf.basic. BasicButtonListener.mouseReleased (Ункнаун Соурсе) at java.awt. Component.processMouseEvent (Ункнаун Соурсе) at javax.swing. JComponent.processMouseEvent (Ункнаун Соурсе) at java.awt. Component.processEvent (Ункнаун Соурсе) at java.awt. Container.processEvent (Ункнаун Соурсе) at java.awt. Component.dispatchEventImpl (Ункнаун Соурсе) at java.awt. Container.dispatchEventImpl (Ункнаун Соурсе) at java.awt. Component.dispatchEvent (Ункнаун Соурсе) at java.awt. LightweightDispatcher.retargetMouseEvent (Ункнаун Соурсе) at java.awt. LightweightDispatcher.processMouseEvent (Ункнаун Соурсе) at java.awt. LightweightDispatcher.dispatchEvent (Ункнаун Соурсе) at java.awt. Container.dispatchEventImpl (Ункнаун Соурсе) at java.awt. Window.dispatchEventImpl (Ункнаун Соурсе) at java.awt. Component.dispatchEvent (Ункнаун Соурсе) at java.awt. EventQueue.dispatchEventImpl (Ункнаун Соурсе) at java.awt. 500 EventQueue.access$ (Ункнаун Соурсе) at java.awt. EventQueue$3.run (Ункнаун Соурсе) at java.awt. EventQueue$3.run (Ункнаун Соурсе) at java.security. AccessController.doPrivileged (Нативе Метод) at java.security. ProtectionDomain $JavaSecurityAccessImpl.doIntersectionPrivilege (Ункнаун Соурсе) at java.security. ProtectionDomain $JavaSecurityAccessImpl.doIntersectionPrivilege (Ункнаун Соурсе) at java.awt. EventQueue$4.run (Ункнаун Соурсе) at java.awt. EventQueue$4.run (Ункнаун Соурсе) at java.security. AccessController.doPrivileged (Нативе Метод) at java.security. ProtectionDomain $JavaSecurityAccessImpl.doIntersectionPrivilege (Ункнаун Соурсе) at java.awt. EventQueue.dispatchEvent (Ункнаун Соурсе) at java.awt. EventDispatchThread.pumpOneEventForFilters (Ункнаун Соурсе) at java.awt. EventDispatchThread.pumpEventsForFilter (Ункнаун Соурсе) at java.awt. EventDispatchThread.pumpEventsForHierarchy (Ункнаун Соурсе) at java.awt. EventDispatchThread.pumpEvents (Ункнаун Соурсе) at java.awt. EventDispatchThread.pumpEvents (Ункнаун Соурсе) at java.awt. EventDispatchThread.run (Ункнаун Соурсе)

Я думаю, что какова проблема, и что он был бы должен делать on delete cascade, но не, как делание этого для того, чтобы программа это выполнила единственный раз, так как я не могу делать изменения в самой базе данных, все должно быть через программу.

1
задан 09.03.2017, 05:36
3 ответа

Не необходимо включать on delete cascade, исключение MySQLIntegrityConstraintViolationException покажи, что совершено нарушение целостности данных, перед тем, как удалять один Artist ты должен удалять все tuplas таблицы AlbumArtist у которого была ссылка на этот tupla Artist.

Ты можешь делать это с независимыми решениями внутри сделки как:

for(AlbumArtist someAlbumArtist :someArtist.getAlbums()){
   AlbumDAO.delete(someAlbumArtist);
}

ArtistDAO.delete(someArtist);

Где someAlbum и someArtist они связаны (должны быть удаленными весь álbumes)

Или в Вашем недостатке смоги включать on delete cascade поскольку ты интуитивно чувствовал, так как никогда не будет существовать альбом без артиста, и логично удалять их вместе с ним.

Не забывай сделать commit(); в конце всего.

3
ответ дан 24.11.2019, 14:28
  • 1
    Я попытаюсь, как ты сказал мне, tambi и # 233; n я нравиться и # 237, то есть, как включать on delete cascade, но что только применялся однажды и не повторялся больше, так как я нравиться и # 237; чтобы так как иметь больше выборов во время решения такой ошибки как этот. – NeoChiri 08.05.2016, 01:01
  • 2
    on delete cascade он определяется в структуре и не может меняться. Даже в ORMs как Hibernate - cuesti и # 243; n неизменной структуры во времени ejecuci и # 243; n. Есть решения используя процедуры, хранившиеся как этот . – Deoxyseia 08.05.2016, 01:48

Это благодаря тому, что есть существующие реестры, связанный с frk, который исчез тогда, производит конфликт, так как он ищет информацию, которая уже не существует в базе данных, перед тем, как удалять frk, рекомендуется удалять все tuplas, соответствующие ей и despuГ©s удалять frk

0
ответ дан 24.11.2019, 14:28

Ты не можешь удалять реестры таблицы Артист, так как чужеземный ключ зависит от других реестров другой таблицы, сначала удали реестры других подмостков, которые содержит чужеземный ключ Артиста, сначала твоя программа способствуй тому, чтобы он удалил таблицу album_artista

 delete from album_artista ab inner join artista ar on ab.artista_id = ar.artista_id  where ab.artista_id = ? 
0
ответ дан 24.11.2019, 14:28