数据迁移到 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 的人,table 结构如下:
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 本身不使用此字段,因此不存在干扰核心功能的风险。 link 使用外部系统(例如遗留系统)完成。
CiviCRM 认为 external_identifier 是唯一的,因此如果您尝试插入联系人,它会抛出错误(使用 API - 我认为)或更新(使用 CiviCRM 联系人导入屏幕)同样的 external_identifier.
我使用 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 的人,table 结构如下:
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 本身不使用此字段,因此不存在干扰核心功能的风险。 link 使用外部系统(例如遗留系统)完成。
CiviCRM 认为 external_identifier 是唯一的,因此如果您尝试插入联系人,它会抛出错误(使用 API - 我认为)或更新(使用 CiviCRM 联系人导入屏幕)同样的 external_identifier.