将数据迁移到CiviCRM - 保留旧ID


Data migration into CiviCRM - keep legacy IDs

我使用CiviCRM的PHP API调用开发自定义迁移代码,例如:

<?php
$result = civicrm_api3('Contact', 'create', array(
  'sequential' => 1,
  'contact_type' => "Household",
  'nick_name' => "boo",
  'first_name' => "moo",
));

需要保留原始 ID,但指定上面的"id"或"contact_id"不起作用。它要么不创建联系人,要么更新现有联系人。当然,ID是自动递增的,但MySQL支持在这种情况下插入任意的唯一值。

你会怎么做?破解CiviCRM以某种方式在INSERT语句中将id传递给MySQL?导入后以某种方式转储 SQL 并在.sql文本文件中就地操作 ID(难以保持完整性)? 对此有什么建议吗?

我至少有~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是唯一的,因此如果您尝试插入具有相同external_identifier的联系人,它将抛出错误(使用API - 我认为)或更新(使用CiviCRM联系人导入屏幕)。