Миграция данных в CiviCRM — сохранить устаревшие идентификаторы

Я разрабатываю пользовательский код миграции, используя вызовы 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              |                             |

и мы говорим о первом поле.

2

Решение

Вы должны использовать поле external_identifier, которое точно сделано для того, что вы хотите.

Это поле не используется самой CiviCRM, поэтому нет риска связываться с основными функциями. Это делается для связи с внешней системой (например, устаревшей).

CiviCRM считает, что external_identifier уникален, поэтому он выдаст ошибку (используя API — я думаю) или обновит (используя экран импорта контактов CiviCRM), если вы попытаетесь вставить контакт с тем же external_identifier.

0

Другие решения

Других решений пока нет …