ORACLE数据库对比表结构

有时候会有某种需求:需要对比两个表的表结构是否一致,有时候甚至是整个数据库所有表的表结构对比......。表结构对比无非就是字段名、字段类型、字段数据类型、以及字段的顺序的对比。如果需要对比表结构,可以通过下面简单的脚本实现:

SELECT M.OWNER
      ,M.TABLE_NAME
      ,M.COLUMN_ID
      ,M.COLUMN_NAME
      ,M.DATA_TYPE
      ,M.DATA_LENGTH
      ,N.OWNER
      ,N.TABLE_NAME
      ,N.COLUMN_ID
      ,N.COLUMN_NAME
      ,N.DATA_TYPE
      ,N.DATA_LENGTH
FROM
(
SELECT OWNER
      ,TABLE_NAME
      ,COLUMN_ID
      ,COLUMN_NAME
      ,DATA_TYPE
      ,DATA_LENGTH
FROM DBA_TAB_COLUMNS
WHERE OWNER=&OWNER_A
  AND TABLE_NAME=&TABLE_NAME_A
) M LEFT JOIN
(
SELECT OWNER
      ,TABLE_NAME
      ,COLUMN_ID
      ,COLUMN_NAME
      ,DATA_TYPE
      ,DATA_LENGTH
FROM DBA_TAB_COLUMNS
WHERE OWNER=&OWNER_B
  AND TABLE_NAME=&TABLE_NAME_B
) N ON  M.COLUMN_ID =N.COLUMN_ID
    AND M.COLUMN_NAME = N.COLUMN_NAME 
    AND M.DATA_TYPE = N.DATA_TYPE 
    AND M.DATA_LENGTH= N.DATA_LENGTH
ORDER BY M.TABLE_NAME, M.COLUMN_ID;

但是如果A表与B表前面的字段一致,然而B表有一些额外的字段,那么上
面的SQL(左连接)就会查不出两者之间结构的不同。此时需要使用右连接才能对比出真正的表结构。所以如果需要对比两者的表结构是否一致,最好左连接查一
次,右连接查一次。才能真正的确认两者的表结构的异同。

SELECT M.OWNER
      ,M.TABLE_NAME
      ,M.COLUMN_ID
      ,M.COLUMN_NAME
      ,M.DATA_TYPE
      ,M.DATA_LENGTH
      ,N.OWNER
      ,N.TABLE_NAME
      ,N.COLUMN_ID
      ,N.COLUMN_NAME
      ,N.DATA_TYPE
      ,N.DATA_LENGTH
FROM
(
SELECT OWNER
      ,TABLE_NAME
      ,COLUMN_ID
      ,COLUMN_NAME
      ,DATA_TYPE
      ,DATA_LENGTH
FROM DBA_TAB_COLUMNS
WHERE OWNER=&OWNER_A
  AND TABLE_NAME=&TABLE_NAME_A
) M RIGHT JOIN
(
SELECT OWNER
      ,TABLE_NAME
      ,COLUMN_ID
      ,COLUMN_NAME
      ,DATA_TYPE
      ,DATA_LENGTH
FROM DBA_TAB_COLUMNS
WHERE OWNER=&OWNER_B
  AND TABLE_NAME=&TABLE_NAME_B
) N ON  M.COLUMN_ID =N.COLUMN_ID
    AND M.COLUMN_NAME = N.COLUMN_NAME 
    AND M.DATA_TYPE = N.DATA_TYPE 
    AND M.DATA_LENGTH= N.DATA_LENGTH
ORDER BY M.TABLE_NAME, M.COLUMN_ID;
时间: 2024-09-29 05:15:40

ORACLE数据库对比表结构的相关文章

表单-多表头和可变表头(一条信息的数据量大小可变。)该怎么设计数据库的表结构。

问题描述 多表头和可变表头(一条信息的数据量大小可变.)该怎么设计数据库的表结构. 我现在有一个表单需要存入数据库.但是客户要求该表单的 表头可变.也就是他要自定义表单.这种情况我该怎么为这张表单设计表结构了?同时该表单中的所有字段都要参加计算的,有些项的值是其他项通过计算得出的.虽然是简单的加减乘除,但是客户要求可以自动的计算.小弟用的Spring MVC+JPA 数据库mysql 或者 oracle 解决方案 一般一个表单中的字段分为固定的字段和 动态的字段. 将固定的字段,设计成一张表,称

Oracle数据库两表更新

问题描述 Oracle数据库两表更新 问个问题:在一个数据库中把两个表结构相同的表更新一下:把A中的数据更新到表B中,B中有而A中没有的则把B中的删除,A中有而B中没有的则插入到B中,B中与A不相同的则修改.数据量比较大,该怎么样才能高效率的完成? 解决方案 还有就是,把B中删除,再插入A中这个不行

[ASP.NET]对Oracle数据库创建表/判断数据表是否已存在

asp.net|oracle|创建|数据|数据库 对Oracle数据库创建表: Dim myConnectionString As String Dim myConnection As OleDbConnection Dim myCommand As OleDbCommand Dim myCreateSQL As String myConnectionString = "Provider='OraOLEDB.Oracle.1';User ID=[User ID];Data Source=[Dat

Oracle数据库的应用结构

  Oracle数据库的应用结构 随着网络技术的发展,Oracle数据库在各个领域得到了广泛应用.基于Oracle数据库的应用系统结构主要分为客户/服务器结构.终端/服务器结构.浏览器/服务器结构和分布式数据库系统结构等. 1.客户/服务器结构 客户/服务器(Client/Server,C/S)结构是两层结构,如图2-2所示.在C/S结构中,需要在前端客户机上安装应用程序,通过网络连接访问后台数据库服务器.用户信息的输入.逻辑的处理和结果的返回都在客户端完成,后台数据库服务器接收客户端对数据库的

sql oracle数据库关联表查询

问题描述 sql oracle数据库关联表查询 现在有一个教师表(教师号 教师名) 课程号(教师号 课程号 课程名) 教室表(教师号 课程号 教室号 教室名) 想显示所有教室的教师名和课程名. 就是想问这种关联的查询语句 排除表中一些矛盾的存在哈 谢谢 解决方案 select b.教师名,c.课程名 from 教室表 a LEFT JOIN 教师表 b ON a.教师号=b.教师号 LEFT JOIN 课程表 c ON 教师表 b ON a.教师号=c.教师号 这个才是对的,刚刚没看清楚写错了.

java 查询oracle数据库所有表DatabaseMetaData的用法(详解)_java

一 . 得到这个对象的实例 Connection con ; con = DriverManager.getConnection(url,userName,password); DatabaseMetaData dbmd = con.getMetaData(); 二. 方法getTables的用法 原型: ResultSet DatabaseMetaData.getTables(String catalog,String schema,String tableName,String []type

Oracle数据库DROP表的时候出现的报错!急急急……

问题描述 Oracle数据库DROP表的时候出现的报错!急急急-- 删除数据库的时候就报这个错,OEA-00604 递归SQL级别1-- 我截了图了,大家帮我看一下. 哇靠 上传不上图片 报错如下 ORA-00604: 递归 SQL 级别 1 出现错误 ORA-00942: 表或视图不存在 ORA-06512:在line 19 解决方案 急急 解决方案二: 1.没事别乱删除表 2.请检查一下是否有约束

Oracle常用查看表结构命令

原文:Oracle常用查看表结构命令 获取表: select table_name from user_tables; //当前用户的表       select table_name from all_tables; //所有用户的表   select table_name from dba_tables; //包括系统表 select table_name from dba_tables where owner='用户名' user_tables: table_name,tablespace

PowerDesigner连接Oracle数据库建表序列号实现自动增长

原文:PowerDesigner连接Oracle数据库建表序列号实现自动增长 创建表就不说了.下面开始介绍设置自动增长列.  1 在表视图的列上创建.双击表视图,打开table properties --->columens ,双击要设置的列(显示列的序号的那个按钮,单击后,会显示横向的黑色箭头).打开column properties 对话框.在 'general' 项中,最下面,找到 sequence,下拉框 后面,有三个按钮就 'create','select','properties'.