2011-02-18 84 views
1

我想比较表格和列几乎相同的DB模式。查找模式差异

mysql> select a.TABLE_SCHEMA, a.TABLE_NAME FROM information_schema.tables as a left join information_schema.tables as b on a.TABLE_NAME = b.TABLE_NAME WHERE a.TABLE_SCHEMA = 'india' AND b.TABLE_SCHEMA = 'china' AND b.TABLE_NAME IS NULL; 

我预计上面的查询会返回那些在印度数据库中存在但不在中国数据库中的表格。但这似乎并没有奏效。 除了表格的差异,我还需要找到那些在2个数据库中可能不同的列。

我不想使用像Navicat这样的应用程序。我需要一个查询或UNIX命令。

回答

1

您需要的AND b.TABLE_SCHEMA = 'china'谓词从WHERE移到JOIN:

select a.TABLE_SCHEMA, a.TABLE_NAME 
FROM information_schema.tables as a left join information_schema.tables as b 
    ON b.TABLE_SCHEMA = 'china' 
    AND a.TABLE_NAME = b.TABLE_NAME 
WHERE a.TABLE_SCHEMA = 'india' AND b.TABLE_NAME IS NULL 

要查找列信息:

SELECT a.TABLE_NAME, a.COLUMN_NAME 
FROM information_schema.columns a LEFT JOIN information_schema.columns b 
    ON b.TABLE_SCHEMA = 'china' 
    AND a.TABLE_NAME = b.TABLE_NAME 
    AND a.ORDINAL_POSITION = b.ORDINAL_POSITION 
    AND a.COLUMN_DEFAULT = b.COLUMN_DEFAULT 
    AND a.IS_NULLABLE  = b.IS_NULLABLE 
    AND a.DATA_TYPE  = b.DATA_TYPE 
    AND a.COLUMN_TYPE  = b.COLUMN_TYPE 
.... Add other comparisons here depending on what you consider non identical. 
WHERE a.TABLE_SCHEMA = 'india' AND b.COLUMN_NAME IS NULL