PrestaShop双站点跨库复制客户账户SQL查询问题求助
解决方案
一、现有SQL笛卡尔积问题修复
你写的SQL使用了隐式交叉连接,未做等值关联的前提下直接使用不等条件过滤,会先生成两个表所有行的笛卡尔积再过滤,自然返回大量冗余数据。
正确的差集查询可以用左连接过滤空值的写法:
查询db1存在、db2不存在的客户
SELECT db1.ps_customer.* FROM db1.ps_customer LEFT JOIN db2.ps_customer ON db1.ps_customer.email = db2.ps_customer.email WHERE db2.ps_customer.email IS NULL;
查询db2存在、db1不存在的客户
把上面语句里两个表的位置互换即可。
二、双向同步注意事项
1. 加密兼容处理
PrestaShop的客户密码哈希依赖站点配置文件config/settings.inc.php中的_COOKIE_KEY_常量,同步前需要先把两个站点的_COOKIE_KEY_改为同一个值,否则同步过去的账户密码无法正常校验,用户无法登录。
2. 主键冲突规避
两个站点的ps_customer表id_customer都是自增主键,直接同步数据会出现主键冲突:
- 方案1:插入目标库时不传入
id_customer字段,让目标库自动生成新的自增ID,以邮箱作为唯一去重标识即可 - 方案2:修改两个库的自增属性,db1设置自增步长为2、起始值为1,db2设置自增步长为2、起始值为2,从根源避免ID冲突
3. 实时同步优化(可选)
CRON定时同步存在延迟,可通过PrestaShop原生钩子实现实时同步:
两个站点都安装自定义模块,绑定actionObjectCustomerAddAfter钩子,客户注册完成后钩子自动触发,直接将新账户数据写入另一个站点的数据库即可。
要注意加同步防重逻辑,避免A同步到B后,B的钩子又触发回传产生循环同步,比如同步写入时加自定义标识字段,检测到是同步过来的账户就不触发回传逻辑。
内容的提问来源于stack exchange,提问作者Sue
相关产品推荐
相关产品推荐

