2010-12-09 2 views
3

정적 hasMany grails에서 User 클래스에 정의 된 많은 자식 테이블을 가진 사용자가 있습니다.Grails GORM과 MYSQL 캐스케이드 삭제 문제

Grails에서 User.get (3) .delete()를 수행 할 때 아무런 문제가 없습니다. 해당 사용자와 모든 하위 테이블 행을 자동으로 삭제합니다. 하지만 MySQL 작업대에서 동일한 작업을 수행하려고 할 때. MySQL에서 던진 에러 :

ERROR 1451: Cannot delete or update a parent row: a foreign key constraint fails (`test_db`.`search_stat`, CONSTRAINT `FK7A3CFFB6E64DB41` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)) 
SQL Statement: 
DELETE FROM `test_db`.`user` WHERE `id`='3' 

MySQL의 문제점은 무엇인지 알지 못합니다.

+1

MySQL의 테이블 정의를 확인하십시오. 외래 키에 "ON DELETE CASCADE"가 설정되어 있습니까? 아니면 배후의 코드에서 GORM/Hibernate가 계단식으로 작동합니까? –

+0

MYSQL 워크 벤치에서 Foreing Keys 탭 아래에 외부 키가 표시되지 않았는지 확인했습니다. Foreing 키 이름 및 참조 그 아래의 테이블 탭은 비어 있습니다. 공란을 클릭하면 fk_user_1이 자동으로 생성되고 다음 탭을 클릭하면 드롭 다운이 db에있는 모든 테이블을 참조 테이블로 선택합니다. 하지만 뭔가 잘못되었다고 생각하며 외래 키를 다시 만들 필요가 없습니다. 나는 그 명령을 mysql 커맨드 라인 버전에서 내가 던져 동일한 오류가 발생 삭제하려고했습니다. –

+0

한편 Grails GORM 문서에서는 belongsTo가 자동으로 삭제/업데이트 동작에 캐스케이드를 생성한다고 말합니다. 그래서 GORM이 MySQL 데이터베이스에 테이블을 만들 때이 동작은 db 스키마로 넘어 갔어야합니다. –

답변

1

설명서에서 "ON DELETE CASCADE"에 대한 정보는 어디에서 읽습니까? 나는 그것을 발견하지 못했다 here. this post 포스터는 원하는 동작을 얻으려면 수동으로 추가해야했습니다.

grails가 정말로 이것을 추가해야한다면, DB를 삭제하고 grails (적어도 개발 환경에서)로 다시 만들었습니까? 아마도 belongsTo 또는 뭔가를 추가하기 전에 현재 스키마가 생성되었을 수 있습니까?

기타 체크 아웃 this Blog post about GORM Gotchas regarding hasMany and belongsTo.

+0

여기 문서에서 –

+0

http://www.grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(GORM).html 분명히 말합니다. 기본 계단식 동작은 계단식으로 이루어집니다. 저장 및 업데이트하지만 belongsTo가 지정되지 않으면 삭제되지 않습니다. –

+0

그래도 "ON DELET CASCADE"를 사용하여 SQL에서 "구현 됨"이라고하지는 않습니까? 어쩌면 별도의 SQL 문을 사용하여 삭제를 계단식으로 덮는 기능 만 수행하는 것일 수도 있습니다. –