`
Qieqie
  • 浏览: 340006 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

非专业处理:Oracle->MySQL的Connect by迁移

阅读更多
这两天在弄一个系统迁移,以适应小平台的要求。数据库要从Oracle移植到Mysql。
比较了种种,包括数据类型、主键自增/序列、字符串函数之后,就剩下一个“层次递推查询”最难办。

具体是这样的:
Oracle的connect by语句能够很好的支持:
1、只根据id和parentId两个字段,便可以查找一个结点的所有子孙结点
2、只根据Id和parentId连个字段,便可以查找一个结点的根(表是一个森林,非树)

MYSQL对等的语句处理这样的功能。

示例的表结构(MySQL):
CREATE TABLE `node` (
  `id` bigint(20) NOT NULL auto_increment,
  `parentId` varchar(20) default NULL,
  `name` varchar(20) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB


第2个问题比较好解决,在此不是主要的讨论点。关键是第1个。

比如有如下数据:
mysql> select * from node;
+----+----------+-------+
| id | parentId | name  |
+----+----------+-------+
|  1 |     NULL | root  |
|  2 |        1 | two   |
|  3 |        1 | three |
|  4 |        2 | four  |
|  5 |        2 | five  |
|  6 |        3 | six   |
|  7 |        3 | seven |
|  8 |        4 | eight |
+----+----------+-------+
8 rows in set (0.02 sec)

那么id=2的所有子孙,将是id为:4,5,8的纪录。

本人不是数据库专家,所以确实很郁闷。不过还好对MYSQL还算有所了解,做了一下一个存储过程来应付:
(该存储过程,不具有通用性,针对的是特定的表名以及id,parentId字段名称,不同的表,需要不同的存储过程,采用selectXxxxxPosterity的命名方式;而且要求子孙的id必须大于父亲的id。)
CREATE PROCEDURE `selectNodePosterity`(IN startId BIGINT)
    NOT DETERMINISTIC
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN

DECLARE _id bigint DEFAULT 0;
DECLARE _path VARCHAR(255);
DECLARE _last bigint DEFAULT 0;

CREATE TEMPORARY TABLE IF NOT EXISTS `temp_table` (
  `id` bigint(20) NOT NULL auto_increment,
  `path` varchar(20) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB TYPE = HEAP;

delete from temp_table;

insert into temp_table(id, path)
        select src.id, src.id from node src where id=startId;

set _id  = startId;
set _path = startId;

WHILE _id <> 0 DO
      insert into temp_table(id, path)
             select src.id, concat(concat(_path, '/'), src.id)
             from node src where src.parentId=_id;
      set _last  = _id;
      set _id  = 0;
      select id, path into _id, _path from temp_table where id>_last limit 1;
END WHILE;

select src.*, temp_table.path from temp_table, node src where temp_table.id= src.id order by temp_table.path;
END;

运行效果:
mysql> call selectNodePosterity(2);
+----+----------+-------+-------+
| id | parentId | name  | path  |
+----+----------+-------+-------+
|  2 |        1 | two   | 2     |
|  4 |        2 | four  | 2/4   |
|  8 |        4 | eight | 2/4/8 |
|  5 |        2 | five  | 2/5   |
+----+----------+-------+-------+
4 rows in set (0.00 sec)

Query OK, 0 rows affected, 2 warnings (0.02 sec)




分享到:
评论

相关推荐

    kafka-connect:Real-time Data Integration.pptx

    - **源连接器示例**:JDBC源连接器可以从关系数据库中提取数据,MySQL、Oracle等。 - **目标连接器示例**:Elasticsearch目标连接器可以将Kafka主题中的数据写入Elasticsearch索引,便于搜索和分析。 ### 5. **...

    hadoop平台下的数据导入导出工具sqoop

    它支持多种关系型数据库,如MySQL、Oracle等,并且能够利用MapReduce作业来处理大规模数据的导入导出任务。通过这种方式,Sqoop不仅提高了数据迁移的效率,还确保了数据的一致性和完整性。 #### 二、Sqoop的特点 1...

    IBM Portal7.0数据库迁移oracle教程完全版

    ### IBM Portal 7.0 数据库迁移至 Oracle 完全教程 #### 一、数据库准备 **1.1 IBM Portal 7.0 兼容的 Oracle 版本及操作系统** IBM Portal 7.0 支持多种 Oracle 数据库版本及操作系统,确保在迁移过程中选择正确...

    sqoop-1.4.6-cdh5.14.2.tar系列安装包

    Sqoop 是 Apache Hadoop 生态系统中的一个工具,主要用于在关系型数据库(如 MySQL、Oracle 等)和 Hadoop 分布式文件系统(HDFS)之间高效地传输数据。这个压缩包“sqoop-1.4.6-cdh5.14.2.tar”是 Sqoop 的一个特定...

    DBI-1.635.tar.gz

    1. 数据库连接:通过提供统一的连接语法,DBI允许程序员创建到数据库的连接,例如`$dbh = DBI-&gt;connect("DBI:mysql:database=dbname;host=localhost", "username", "password")`。 2. SQL执行:DBI支持预编译的SQL...

    dbmove_sql语句转化.zip_MYSQL_dbmove_oracle

    Oracle的CONNECT BY用于构建层次查询,而在MySQL中可能需要递归的用户定义变量或JOIN操作。子查询在两个系统中语法也略有不同。 7. **事务控制**: Oracle和MySQL都支持事务,但语法上有一些差异。如Oracle使用...

    PHP ADODB 1.99版手册中文翻译

    $db-&gt;Connect('localhost', 'username', 'password', 'database')) { die("无法连接到数据库"); } ``` ### 2. 查询执行与结果处理 ADODB支持SQL查询的执行,包括SELECT、INSERT、UPDATE和DELETE等操作。`Execute...

    Oracle-不同数据库DBLINK导数据使用说明

    其中,数据库链接(DBLINK)是Oracle提供的一种高级特性,用于实现不同Oracle数据库之间的数据交互,尤其适用于数据迁移、分布式事务处理以及跨数据库查询等场景。本文将围绕“Oracle-不同数据库DBLINK导数据使用...

    mysql+oracle数据库驱动程序

    public class MySQLConnect { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test...

    12_离线计算系统_第12天(辅助系统).docx

    sqoop import/export --connect &lt;JDBC_URL&gt; --table &lt;TABLE_NAME&gt; --target-dir &lt;HDFS_DIR&gt; --username &lt;USER&gt; --password &lt;PASSWORD&gt; [其他选项] ``` 1.4.2 Sqoop 导入示例 导入 MySQL 数据库中的 `mytable` 到 ...

    sqoop1-1.4.6 documentation 英文文档

    - **数据库**: MySQL、Oracle、PostgreSQL、DB2 等主流关系型数据库。 #### 3. Sqoop 发行版 Sqoop 1.4.6 是 Sqoop 的一个稳定版本,包含了一系列功能改进和错误修复,旨在提供更稳定的数据迁移体验。 #### 4. ...

    mysql-connector-java-8.0.13.jar

    MySQL Connector/J 8.0.13 是MySQL数据库与Java应用程序之间的重要桥梁,它是Oracle官方提供的用于Java平台的MySQL驱动程序。这个jar包允许开发者在Java应用中执行SQL语句,进行数据的读取、写入和管理MySQL数据库。...

    oracle数据库备份

    本节提到了多种备份方式和技术,包括但不限于:`COPY`, `RMAN`, DDL(Data Definition Language)、DCL(Data Control Language)和DML(Data Manipulation Language),以及MySQL的`mysqldump`命令、Oracle的`EXP`...

    PHP 多种数据库 mysql等6种 独立查询接口 类 实现源码

    尽管如此,了解其基本用法仍然是必要的,例如`mysql_connect()`用于建立连接,`mysql_query()`执行SQL查询,`mysql_fetch_assoc()`获取查询结果。 2. **mysqli**:是“Improved MySQL Interface”的缩写,是PHP官方...

    kafka-connect-jdbc-4.1.1.zip

    JDBC(Java Database Connectivity)是 Kafka Connect 中的一个特定实现,它支持广泛的数据库系统,如 MySQL、PostgreSQL、Oracle 等,使得用户可以方便地将数据流导入或导出到这些数据库。 在 `kafka-connect-jdbc...

    python 实现Oracle /Mysql ETl 导入greenplum 数据库。

    本篇文章将深入探讨如何使用Python实现Oracle和MySQL数据库的数据抽取,转换,并加载到Greenplum数据库的过程。 首先,我们需要理解ETL的三个基本步骤: 1. **Extract(抽取)**:这是数据提取阶段,从源系统中...

    oracle 转换MSSLQ2008介绍

    SQL Server Migration Assistant(简称SSMA)是一款由微软提供的工具,旨在帮助用户更轻松地将其现有的Oracle、Sybase、MySQL或Access数据库迁移至SQL Server或SQL Azure。本文将详细介绍如何使用SSMA将Oracle数据库...

    embulk之sqlserver to mysql

    ### 使用Embulk实现SQL Server至MySQL的数据迁移 #### 一、背景介绍 随着业务发展和技术迭代,企业常常需要在不同的数据库之间进行数据迁移。本文主要介绍如何使用Embulk这一工具来实现从SQL Server到MySQL的数据...

Global site tag (gtag.js) - Google Analytics