我使用CiviCRM的PHP API调用开发自定义迁移代码,如:
<?php
$result = civicrm_api3('Contact', 'create', array(
'sequential' => 1,
'contact_type' => "Household",
'nick_name' => "boo",
'first_name' => "moo",
));
需要保留原始ID,但要指定&#39; id&#39;或者&#39; contact_id&#39;以上不起作用。它要么不创建联系人,要么更新现有联系人。 当然,ID是自动递增的,但在这种情况下,MySQL支持插入任意的唯一值。
你会怎么做? Hack 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 | |
我们谈论第一个领域。
答案 0 :(得分:0)
您应该使用external_identifier字段,该字段完全符合您的要求。
CiviCRM本身不使用此字段,因此不存在混淆核心功能的风险。完成了与外部系统(例如传统)的链接。
CiviCRM认为external_identifier是唯一的,因此如果您尝试插入具有相同external_identifier的联系人,它将抛出错误(使用API - 我认为)或更新(使用CiviCRM联系人导入屏幕)。