这两天在弄一个系统迁移,以适应小平台的要求。数据库要从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)
分享到:
相关推荐
Navicat premium是一款强大的数据库管理软件,使用它可以轻松连接到MySQL、SQLite、Oracle、MariaDB、Mssql、及PostgreSQL数据库,让管理不同类型的数据库更加的方便。有了Navicat Premium,您不再需要为不同的...
ogg sqlserver-oracle mysql-oracle mysql-mysql的同步配置参考,少走弯路。
银行数据库改造之路:Oracle to MySQL迁移实践.pdf
本文详细介绍如何讲oracle rac的数据库数据进行迁移备份,配有图文,适合做做实验在再去实践
oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm --基础包,为了运行OCI、OCCI、JDBC-OCI 这几个应用程序; oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm --补充包/文件,是为了运行sql*plus...
Oracle12 64位的客户端, plsql 使用方法: Tools->Preferences->Oracle->Connection->OCI libraty 选择,解压后的 oci.dll
Windows Oracle Golden Gate 单向数据同步 , 重要用于数据库容灾备份以及数据分发。本文基于Windows系统操作。
Oracle到Mysql数据库迁移总结Oracle到Mysql数据库迁移总结Oracle到Mysql数据库迁移总结Oracle到Mysql数据库迁移总结
oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm --基础包,为了运行OCI、OCCI、JDBC-OCI 这几个应用程序; oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm --补充包/文件,是为了运行sql*plus...
2021年6.29号打包,最新版本:kafka-connect-oracle-1.0.71.jar,用于根据oracle binglog日志同步数据到kafka
开始->设置->控制面板->管理工具->服务停止所有Oracle服务; 快捷方法:开始-->输入services.msc 关闭服务 第二步:启动卸载 开始--说有程序- Oracle – OraDb10g_home1--Oracle安装产品(Oracle ...
java工程(java_oracle)—>右键属性(Properties)->Java Build Path->Libraries->Add External JARs->添加oracle安装目录C:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib下的“ojdbc6_g.jar”文件;...
oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm --基础包,为了运行OCI、OCCI、JDBC-OCI 这几个应用程序; oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm --补充包/文件,是为了运行sql*plus...
今天从oracle迁移数据到mysql碰到个需求:原先的主键字段需要改成mysql中的自增字段,而且原先数据的值不能变,以后新插入的值从原先数据最大的值开始自增。 解决办法: 构建环境: mysql> CREATE TABLE test -> ( ...
通过SSIS导入数据(SQL Server2005-->Oracle11g) 通过SSIS导入数据(SQL Server2005-->Oracle11g),自己总结,已测试通过;
transferdb用于分布式数据库迁移(Oracle数据库-> MySQL数据库),现阶段支持的功能(原transferdb版本被重构): 支持表结构定义转换 考虑到Oracle分区表特殊且MySQL数据库复杂分区可能不支持,分区表统一认为普通...
DRS提供创建任务后修改流速模式,目前仅以下链路的实时同步支持该功能:Oracle->GaussDB(for MySQL)主备版Oracle->GaussDB
ORA-01036:非法的变量名/编号 oracle特有的错误
DM-ORACLE-SQLSERVER存储过程迁移,主要是数据库的存储过程备份,迁移说明文档
在.net2008中用c#绘制windowsform.把数据库中的表格从mysql导入到oracle。可以定时转移。但需要对开发环境进行简单配置(odbc)。分数不够了。传个。