programing

장고 "하위 행을 추가하거나 업데이트할 수 없습니다. 외부 키 제약 조건이 실패합니다."

shortcode 2022. 10. 25. 20:30
반응형

장고 "하위 행을 추가하거나 업데이트할 수 없습니다. 외부 키 제약 조건이 실패합니다."

모델이 있습니다.Coupon, 및 모델Photo와 함께ForeignKey다음 중 하나를 선택합니다.

class Photo(models.Model):
    coupon = models.ForeignKey(Coupon,
                               related_name='description_photos')
    title = models.CharField(max_length=100)
    image = models.ImageField(upload_to='images')

관리자에서 인라인을 설정했기 때문에 관리자 쿠폰에 사진을 추가할 수 있게 되었습니다.

하나를 추가하려고 하면 업로드가 성공하지만 다음 오류와 함께 Django의 디버깅 페이지가 나타납니다.

IntegrityError at /admin/coupon/coupon/321/
(1452, 'Cannot add or update a child row: a foreign key constraint fails (`my_project`.`coupon_photo`, CONSTRAINT `coupon_id_refs_id_90d7f06` FOREIGN KEY (`coupon_id`) REFERENCES `coupon_coupon` (`id`))')

이것은 무엇이며 어떻게 이 문제를 해결할 수 있습니까?

(중요한 것은 MySQL 데이터베이스입니다.)

편집: 데이터셋이 약간 다른Sqlite3 데이터베이스에서 시도했는데 작동했습니다.현재 DB에 데이터가 남아 있지 않을까요?어떻게 찾아서 삭제할 수 있나요?

InnoDB에 있는 테이블도 있고 MyISAM에 있는 테이블도 있고MyISAM으로 모든 것을 변경했고 문제가 해결되었습니다.

DATABASES = {
'default': {
    ...         
    'OPTIONS': {
         "init_command": "SET foreign_key_checks = 0;",
    },
 }
}

(공식 문서에 따르면) 이전 버전의 Django에서는 InnoDB 스토리지 엔진을 사용할 때 정방향 참조(데이터베이스에 아직 삽입되지 않은 행과의 관계)가 있는 고정 장치가 로드되지 않았습니다.이는 InnoDB가 트랜잭션이 커밋될 때까지 체크를 미루지 않고 바로 외부 키 제약사항을 체크함으로써 SQL 표준에서 벗어나기 때문입니다.이 문제는 Django 1.4에서 해결되었습니다.

이 문제를 피하기 위해 사용자가 할 수 있는 것은 다음과 같이 설정하는 것입니다.STORAGE_ENGINE설정을 변경합니다.화이

django > = 1.2의 경우

DATABASES = {
    'default': {
        ...
        'STORAGE_ENGINE': 'MyISAM / INNODB / ETC'
    }
}

django <= 1.2의 경우

DATABASE_STORAGE_ENGINE = "MyISAM / INNODB / ETC"

이것은 MySQL에만 유효합니다.

이 오류의 원인은 먼저 하위 테이블을 저장한 다음 상위 테이블을 저장하려고 하기 때문일 수 있습니다.
이에 대한 해결책은 을 사용하는 것입니다.

DATABASES = {
 'default': {
  ...         
 'OPTIONS': {
     "init_command": "SET foreign_key_checks = 0;",
     },
  }
}

2) 데이터베이스 동작 흐름 확인 및 작성parent ---> child

같은 문제가 발생하였습니다.mmrs151의 솔루션은 동작하지만 NB는 다음과 같습니다.Django <= 1.2(복수의 데이터베이스를 지원하기 전) 설정은 다음과 같습니다.

DATABASE_OPTIONS = {"init_command": "SET foreign_key_checks = 0;"}

Ram Rachum은 문제를 해결하기보다는 해결한 것으로 보입니다.MyISAM은 트랜잭션을 전혀 지원하지 않습니다.

다른 옵션은 MySQL 테이블에서 구속조건을 삭제하는 것입니다.

alter table <TABLE_NAME> drop foreign key <CONTRAINT_NAME>;

언급URL : https://stackoverflow.com/questions/6178816/django-cannot-add-or-update-a-child-row-a-foreign-key-constraint-fails

반응형