Я разрабатываю пользовательский код миграции, используя вызовы CiviCRM PHP API, такие как:
<?php
$result = civicrm_api3('Contact', 'create', array(
'sequential' => 1,
'contact_type' => "Household",
'nick_name' => "boo",
'first_name' => "moo",
));
Необходимо сохранить оригинальные идентификаторы, но указание «id» или «contact_id» выше не работает. Он либо не создает контакт, либо обновляет существующий.
Конечно, идентификатор автоматически увеличивается, но MySQL поддерживает вставку произвольных уникальных значений в этом случае.
Как бы вы поступили? Взломать CiviCRM, чтобы как-то передать идентификатор MySQL в операторе INSERT? Каким-то образом сбросить SQL после импорта и манипулировать идентификаторами на месте в текстовом файле .sql (трудно поддерживать целостность)? Какие-нибудь предложения для этого?
У меня есть ~ 300.000 записей, по крайней мере, для решения, поэтому необходимо полностью автоматизированное и надежное решение. Любая магия SQL потенциально может сделать это?
Для тех, кто не знаком с CiviCRM, структура таблицы следующая:
mysql> desc civicrm_contact;
+--------------------------------+------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------------+------------------+------+-----+-------------------+-----------------------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| contact_type | varchar(64) | YES | MUL | NULL | |
| contact_sub_type | varchar(255) | YES | MUL | NULL | |
| do_not_email | tinyint(4) | YES | | 0 | |
| do_not_phone | tinyint(4) | YES | | 0 | |
| do_not_mail | tinyint(4) | YES | | 0 | |
| do_not_sms | tinyint(4) | YES | | 0 | |
| do_not_trade | tinyint(4) | YES | | 0 | |
| is_opt_out | tinyint(4) | NO | | 0 | |
| legal_identifier | varchar(32) | YES | | NULL | |
| external_identifier | varchar(64) | YES | UNI | NULL | |
и мы говорим о первом поле.
Вы должны использовать поле external_identifier, которое точно сделано для того, что вы хотите.
Это поле не используется самой CiviCRM, поэтому нет риска связываться с основными функциями. Это делается для связи с внешней системой (например, устаревшей).
CiviCRM считает, что external_identifier уникален, поэтому он выдаст ошибку (используя API — я думаю) или обновит (используя экран импорта контактов CiviCRM), если вы попытаетесь вставить контакт с тем же external_identifier.
Других решений пока нет …