前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Navicat数据同步,主键重复无法插入

Navicat数据同步,主键重复无法插入

作者头像
宣言言言
发布2019-12-19 13:56:06
2.8K0
发布2019-12-19 13:56:06
举报
文章被收录于专栏:宣言(Siam)博客

基础知识

Navicat是一个非常好用的可视化mysql管理软件(其他数据库也有对应版本的支持)

它拥有非常丰富的功能,结构同步、数据同步、数据传输、进程监控、数据导出导入等等

但这是一个付费软件,新用户可以免费试用,这个问题是笔者在以前试用处理数据的时候遇到的。

问题

在A和B机器上分别有结构相同数据不完全相同的两个数据库

比如

A机器上的表

id

name

age

1

宣言

21

2

Siam

21

B机器上的表

id

name

age

1

宣言B

22

2

SiamB

22

现在要实现的点是:将两个表的数据合并为一个,以后统一使用一个数据库即可。

在使用数据同步的时候,能筛选出不同数据,但是却不能运行,因为筛选出的数据主键在第二个数据库中已经被占用。

使用软件,选择A同步到B,那么会筛选出id 1 2两条数据

生成的语句却是以下这样子的

代码语言:javascript
复制
insert into 表名 (id, name, age) values (1, '宣言', 21) ...

在B中运行这样的语句。主键id重复,自然就会产生失败了

问题怎么解决

因为我这里需要处理的数据量比较小

我这里采用的是比较直接的方法,如果有更好的方式,请大家在评论中留言,一起探讨

  • 在A中筛选出差异数据(可以根据软件或者其他筛选条件等)
  • 数据压缩成json字符串,大概如图所示
  • json文件上传到B机器中,写一个脚本,读取json 并且删除id主键,重新生成insert语句
代码语言:javascript
复制
$data = file_get_contents("./data.txt");
$data = json_decode($data, true);

foreach ($data as $key => $value){
    unset($value['id']);
    $sql = "INSERT xxx " . array_to_sql($value);
    mysql_query($sql,$db);
}
echo "ok";

因为是一个临时的脚本,这里就没有引入其他类库,用了面向过程的php代码来完成,大概思路就是这样子。

如果是使用mysqladmin,还可以在导出的时候直接选成导出php array 也许会更方便哦!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.10.16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基础知识
  • 问题
  • 问题怎么解决
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档