web-dev-qa-db-ja.com

Django "子行を追加または更新できません:外部キー制約が失敗します"

モデルCouponとモデルPhotoForeignKeyがあります:

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にデータがありませんか?見つけて削除するにはどうすればよいですか?

65
Ram Rachum

テーブルの一部はInnoDBにあり、一部はMyISAMにありました...すべてをMyISAMに変更し、問題を解決しました。

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

公式ドキュメントによると )Djangoの以前のバージョンでは、前方参照(つまり、データベースにまだ挿入されていない行との関係)を持つフィクスチャは、InnoDBストレージエンジンを使用するとロードに失敗していました。これは、トランザクションがコミットされるまでチェックを延期するのではなく、外部キー制約をすぐにチェックすることでInnoDBがSQL標準から逸脱するためです。この問題はDjango 1.4で解決されました。

67
mmrs151

これを回避するには、STORAGE_ENGINE your settings.py

for Django> = 1.2

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

for Django <= 1.2

DATABASE_STORAGE_ENGINE = "MyISAM / INNODB / ETC"

これはMySQLでのみ有効であることに注意してください

19
ApPeL

私はこれと同じ問題に遭遇しました:mmrs151のソリューションは動作しますが、[〜#〜] nb [〜#〜] that、for Django <= 1.2i.e。複数データベースのサポート前)、設定は次のようになります。

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

Ram Rachumは問題を解決するのではなく回避したように見えることに注意してください:MyISAMはトランザクションをまったくサポートしていません...

4
supervacuo

このエラーの理由は、最初に子テーブルを保存してから親を保存しようとすることです。
このソリューションは使用しています。

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

2)。データベースの操作フローを確認して、parent ---> child

4
GrvTyagi