热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【解决问题】完成从Mysql到SQLite数据库的整体迁移

我们公司的CTO要求我维护客户端的数据库,并且下达了一个命令。android客户端的DB从最初到最后是与ServerDB保持一致的。最初的想法是,我遇到的问题网络上应该有的,我就不断的查找,包括英文的

我们公司的CTO要求我维护客户端的数据库,并且下达了一个命令。android客户端的DB从最初到最后是与ServerDB保持一致的。

最初的想法是,我遇到的问题网络上应该有的,我就不断的查找,包括英文的网站上只找到一篇。(时间我没记错是2007年) 他也没有什么好的办法。

他的办法经过我加工修改得出,若要实现成功迁移要保证:

1.服务器端创建Mysql数据库的时候要讲究 1, 不要加注记(因为我的java程序没有去处理,注记也叫注视) 2、编码为UTF-8

2.利用工具生成.sql文件.需要更改的地方有:

                       

1.       SET FOREIGN_KEY_CHECKS=0;  该句需要删除

2.       .sql文件定义主键是:

CREATE TABLE `dishes` (

  `id` int(11) NOT NULL AUTO_INCREMENT,….. ,PRIMARY KEY (`id`));

在SQLite中只要写int(11) PRIMARY KEY NOT NULL 即可实现autoincrement

3.       ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8 这句话不能要

4.       COMMENT (注记) 之后的内容,包括它都不能要

 

举个例子吧

/*
MySQL Data Transfer
Source Host: 192.168.1.151
Source Database: test
Target Host: 192.168.1.151
Target Database: test
Date: 2011-8-31 18:00:18
*/

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for dishes
-- ----------------------------
DROP TABLE IF EXISTS `dishes`;
CREATE TABLE `dishes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `d_enname` varchar(255) NOT NULL,
  `d_name` varchar(255) NOT NULL,
  `d_price` float NOT NULL,
  `d_image` varchar(255) DEFAULT NULL,
  `d_taste` varchar(255) NOT NULL,
  `d_cook` varchar(255) NOT NULL,
  `d_spiciness` int(11) NOT NULL DEFAULT '0',
  `d_calories` int(11) NOT NULL DEFAULT '0',
  `d_time` int(11) NOT NULL DEFAULT '0',
  `mc_id` int(11) NOT NULL,
  `mt_id` int(11) NOT NULL,
  `mit_id` int(11) NOT NULL,
  `d_ingredients` varchar(255) NOT NULL,
  `r_id` int(11) DEFAULT '0',
  `version_id` int(11) DEFAULT '0',
  `d_content` varchar(255) DEFAULT NULL,
  `discount_price` float DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8;

 

红色的部分,包括倒数第三行那个"," 都需要删掉或者修改的。改动以后的结果是:

/*
MySQL Data Transfer
Source Host: 192.168.1.151
Source Database: test
Target Host: 192.168.1.151
Target Database: test
Date: 2011-8-31 18:00:18
*/

-- ----------------------------
-- Table structure for dishes
-- ----------------------------
DROP TABLE IF EXISTS `dishes`;
CREATE TABLE `dishes` (
  `id` int(11) PRIMARY KEY NOT NULL,
  `d_enname` varchar(255) NOT NULL,
  `d_name` varchar(255) NOT NULL,
  `d_price` float NOT NULL,
  `d_image` varchar(255) DEFAULT NULL,
  `d_taste` varchar(255) NOT NULL,
  `d_cook` varchar(255) NOT NULL,
  `d_spiciness` int(11) NOT NULL DEFAULT '0',
  `d_calories` int(11) NOT NULL DEFAULT '0',
  `d_time` int(11) NOT NULL DEFAULT '0',
  `mc_id` int(11) NOT NULL,
  `mt_id` int(11) NOT NULL,
  `mit_id` int(11) NOT NULL,
  `d_ingredients` varchar(255) NOT NULL,
  `r_id` int(11) DEFAULT '0',
  `version_id` int(11) DEFAULT '0',
  `d_content` varchar(255) DEFAULT NULL,
  `discount_price` float DEFAULT NULL);

这样的.sql文件可以使用SQLite Expert 直接导入sql文件(前提是你已经自己创建了一个数据库).

OK,那些表已经完全迁移过来了。

另外,附着我写的关于自动修改该.sql文件代码如下,(注意源文件要改名为test.sql,目标文件为result.sql,放在E盘下,当然自己可以手动去改)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStreamReader;

public class ConvertScript {

/**
* @param args
*/
public static void main(String[] args) {

try {
read("E:/test.sql","E:/result.sql");
} catch (Exception e) {
e.printStackTrace();
}
}

public static void read(String sourcePath,String destionPath) throws Exception {
InputStreamReader read = new InputStreamReader (new FileInputStream(new File(sourcePath)), "UTF-8");
FileWriter fw = new FileWriter(new File(destionPath));
BufferedReader reader = new BufferedReader(read);
BufferedWriter writer = new BufferedWriter(fw);

String s = null;
StringBuilder sb = new StringBuilder();
while((s = reader.readLine()) != null) {
String replace = null;
String result = null;
if(s.contains("SET FOREIGN_KEY_CHECKS=0;")) {
replace = "SET FOREIGN_KEY_CHECKS=0;";
result = "\r\n";
} else if(s.contains("NOT NULL AUTO_INCREMENT")) {
replace = "NOT NULL AUTO_INCREMENT";
result = "PRIMARY KEY NOT NULL";
} else if(s.contains("PRIMARY KEY (`id`)")) {
replace = "";
} else if(s.contains("ENGINE=InnoDB AUTO_INCREMENT") || s.contains(") ENGINE=InnoDB DEFAULT CHARSET=utf8")) {
s = ");";
}

if(s.equals(");")) {
String resultStr = sb.toString();
sb = new StringBuilder();
sb.append(resultStr.substring(0, resultStr.lastIndexOf(",")));
}

if(replace != null && result != null)
s = s.replace(replace, result);
if(!"".equals(replace)) {
sb.append(s).append("\r\n");
}

}
System.out.println(sb.toString());
writer.write(sb.toString());
reader.close();
writer.close();

}

}


 


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
author-avatar
行玲于諭淑臻
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有