这两天在弄一个系统迁移,以适应小平台的要求。数据库要从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)
分享到:
相关推荐
- **源连接器示例**:JDBC源连接器可以从关系数据库中提取数据,MySQL、Oracle等。 - **目标连接器示例**:Elasticsearch目标连接器可以将Kafka主题中的数据写入Elasticsearch索引,便于搜索和分析。 ### 5. **...
它支持多种关系型数据库,如MySQL、Oracle等,并且能够利用MapReduce作业来处理大规模数据的导入导出任务。通过这种方式,Sqoop不仅提高了数据迁移的效率,还确保了数据的一致性和完整性。 #### 二、Sqoop的特点 1...
### IBM Portal 7.0 数据库迁移至 Oracle 完全教程 #### 一、数据库准备 **1.1 IBM Portal 7.0 兼容的 Oracle 版本及操作系统** IBM Portal 7.0 支持多种 Oracle 数据库版本及操作系统,确保在迁移过程中选择正确...
Sqoop 是 Apache Hadoop 生态系统中的一个工具,主要用于在关系型数据库(如 MySQL、Oracle 等)和 Hadoop 分布式文件系统(HDFS)之间高效地传输数据。这个压缩包“sqoop-1.4.6-cdh5.14.2.tar”是 Sqoop 的一个特定...
1. 数据库连接:通过提供统一的连接语法,DBI允许程序员创建到数据库的连接,例如`$dbh = DBI->connect("DBI:mysql:database=dbname;host=localhost", "username", "password")`。 2. SQL执行:DBI支持预编译的SQL...
Oracle的CONNECT BY用于构建层次查询,而在MySQL中可能需要递归的用户定义变量或JOIN操作。子查询在两个系统中语法也略有不同。 7. **事务控制**: Oracle和MySQL都支持事务,但语法上有一些差异。如Oracle使用...
$db->Connect('localhost', 'username', 'password', 'database')) { die("无法连接到数据库"); } ``` ### 2. 查询执行与结果处理 ADODB支持SQL查询的执行,包括SELECT、INSERT、UPDATE和DELETE等操作。`Execute...
其中,数据库链接(DBLINK)是Oracle提供的一种高级特性,用于实现不同Oracle数据库之间的数据交互,尤其适用于数据迁移、分布式事务处理以及跨数据库查询等场景。本文将围绕“Oracle-不同数据库DBLINK导数据使用...
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...
sqoop import/export --connect <JDBC_URL> --table <TABLE_NAME> --target-dir <HDFS_DIR> --username <USER> --password <PASSWORD> [其他选项] ``` 1.4.2 Sqoop 导入示例 导入 MySQL 数据库中的 `mytable` 到 ...
- **数据库**: MySQL、Oracle、PostgreSQL、DB2 等主流关系型数据库。 #### 3. Sqoop 发行版 Sqoop 1.4.6 是 Sqoop 的一个稳定版本,包含了一系列功能改进和错误修复,旨在提供更稳定的数据迁移体验。 #### 4. ...
MySQL Connector/J 8.0.13 是MySQL数据库与Java应用程序之间的重要桥梁,它是Oracle官方提供的用于Java平台的MySQL驱动程序。这个jar包允许开发者在Java应用中执行SQL语句,进行数据的读取、写入和管理MySQL数据库。...
本节提到了多种备份方式和技术,包括但不限于:`COPY`, `RMAN`, DDL(Data Definition Language)、DCL(Data Control Language)和DML(Data Manipulation Language),以及MySQL的`mysqldump`命令、Oracle的`EXP`...
尽管如此,了解其基本用法仍然是必要的,例如`mysql_connect()`用于建立连接,`mysql_query()`执行SQL查询,`mysql_fetch_assoc()`获取查询结果。 2. **mysqli**:是“Improved MySQL Interface”的缩写,是PHP官方...
JDBC(Java Database Connectivity)是 Kafka Connect 中的一个特定实现,它支持广泛的数据库系统,如 MySQL、PostgreSQL、Oracle 等,使得用户可以方便地将数据流导入或导出到这些数据库。 在 `kafka-connect-jdbc...
本篇文章将深入探讨如何使用Python实现Oracle和MySQL数据库的数据抽取,转换,并加载到Greenplum数据库的过程。 首先,我们需要理解ETL的三个基本步骤: 1. **Extract(抽取)**:这是数据提取阶段,从源系统中...
SQL Server Migration Assistant(简称SSMA)是一款由微软提供的工具,旨在帮助用户更轻松地将其现有的Oracle、Sybase、MySQL或Access数据库迁移至SQL Server或SQL Azure。本文将详细介绍如何使用SSMA将Oracle数据库...
### 使用Embulk实现SQL Server至MySQL的数据迁移 #### 一、背景介绍 随着业务发展和技术迭代,企业常常需要在不同的数据库之间进行数据迁移。本文主要介绍如何使用Embulk这一工具来实现从SQL Server到MySQL的数据...