MySQL での外部キー制約の一時的な無効化
MySQL では、外部キー制約により参照整合性が強制され、関連するテーブル間のデータの一貫性が確保されます。ただし、モデルの削除時など、これらの制約を一時的に無効にする必要があるシナリオもあります。
相互外部キー関係を持つ次の Django モデルを考えてみましょう:
class Item(models.Model): style = models.ForeignKey('Style', on_delete=models.CASCADE) class Style(models.Model): item = models.ForeignKey('Item', on_delete=models.CASCADE)
両方のモデルのインスタンスを順番に削除しようとすると、エラーが発生する可能性があります:
cursor.execute("DELETE FROM myapp_item WHERE n = %s", n) transaction.commit_unless_managed() # foreign key constraint fails here cursor.execute("DELETE FROM myapp_style WHERE n = %s", n) transaction.commit_unless_managed()
この外部キー制約をバイパスするには、次のいずれかの方法を使用して一時的に無効にします。
1. DISABLE KEYS:
ALTER TABLE myapp_item DISABLE KEYS;
このコマンドは、テーブルが再度開かれるか閉じられると、制約を再度有効にします。
2. SET FOREIGN_KEY_CHECKS:
SET FOREIGN_KEY_CHECKS = 0; # Disable foreign key checks
削除操作の後に必ず制約を再度有効にしてください:
SET FOREIGN_KEY_CHECKS = 1; # Re-enable foreign key checks
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3