dbを復元する際の外部キーの問題

dbをエクスポートして別のサーバに復元しようとすると、以下のような外部キーの問題が発生します。新しいサーバーにインポートする際に外部キーチェックを無効にするのは安全ですか?

(私たちはAPIを使ってインデックスを修正しようとしました)

エラー:

SQLクエリ:

ALTER TABLE `civicrm_activity`
 ADD CONSTRAINT `FK_civicrm_activity_campaign_id` FOREIGN KEY 
 (`campaign_id`) REFERENCES `civicrm_campaign` (`id`) ON DELETE SET NULL,
 ADD CONSTRAINT `FK_civicrm_activity_original_id` FOREIGN KEY (`original_id`) REFERENCES `civicrm_activity` (`id`) ON DELETE CASCADE,
 ADD CONSTRAINT `FK_civicrm_activity_parent_id` FOREIGN KEY (`parent_id`) 
 REFERENCES `civicrm_activity` (`id`) ON DELETE CASCADE,
 ADD CONSTRAINT `FK_civicrm_activity_phone_id` FOREIGN KEY (`phone_id`) REFERENCES `civicrm_phone` (`id`) ON DELETE SET NULL,
 ADD CONSTRAINT `FK_civicrm_activity_relationship_id` FOREIGN KEY 
 (`relationship_id`) REFERENCES `civicrm_relationship` (`id`) ON DELETE SET NULL

MySQLは言った:ドキュメンテーション

1452 – 子行を追加または更新できません:外部キー制約は失敗します( chercivi_life1
#sql-622_4c0a 、CONSTRAINT
FK_civicrm_activity_campaign_id
campaign_id )参照 civicrm_campaign
id )をON DELETE SET NULLに設定してください)

ベストアンサー

あなたのcivicrm_activityテーブルに孤児データがあるかもしれないと思います。結果が得られたかどうかを確認するために以下のクエリを実行できますか?

SELECT * FROM `civicrm_activity` ca 
LEFT JOIN civicrm_campaign cc ON cc.id = ca.campaign_id
WHERE ca.campaign_id IS NOT NULL AND cc.id IS NULL;

結果が得られたら、このアクティビティを削除するか、このレコードすべてに対してcampaign_idをNULLにする必要があります。

注意:CiviCRMでは外部キーが重要です。多くの外部キーはON CASCADE DELETEまたはSET
NULLに設定されています。将来的にCiviCRMをアップグレードする際に問題が発生する可能性のあるデータベースを無効にすると、データベース内に孤立したデータが残ってしまう可能性があります。

以下のクエリを使用してcivicrm_activity.campaign_idを更新するか、キャンペーンの活動を削除することができます

UPDATE `civicrm_activity` ca 
LEFT JOIN civicrm_campaign cc ON cc.id = ca.campaign_id
SET ca.campaign_id = NULL
WHERE ca.campaign_id IS NOT NULL AND cc.id IS NULL;

OR

DELETE ca.* FROM `civicrm_activity` ca 
LEFT JOIN civicrm_campaign cc ON cc.id = ca.campaign_id
WHERE ca.campaign_id IS NOT NULL AND cc.id IS NULL;

注意:上記のsqlを実行する前にデータベースをバックアップしてください。

HTH

Pradeep

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です