2015-01-07 43 views
1

我有表的兩個環境(生產和開發)查詢檢查表的差異在兩個倉庫

SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'production'; 

數量在生產300

後安裝一個新功能的開發出現了多個表

SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'development'; 

開發表的數量303

我不知道f有一個Query(沒有像MySQLdiff這樣的extencion)來檢查已經添加的表是什麼,我的意思是3個正在開發但沒有生產的表。

回答

2

如何使用LEFT JOIN來獲得兩個臨時表,即一個與你的生產計劃表和一個與你的開發計劃表的差異:

SELECT table_name_development FROM 
    (SELECT table_name AS table_name_development FROM information_schema.tables WHERE table_schema = 'development') AS d 
LEFT JOIN 
    (SELECT table_name AS table_name_production FROM information_schema.tables WHERE table_schema = 'production') AS p 
ON table_name_development=table_name_production 
WHERE table_name_production IS NULL; 
+0

該查詢可以工作,但不是返回表名,而是返回空值 –

+0

當然,它應該讀取SELECT table_name_development,因爲這些是您在其中查找的條目。對不起,我相應地更新了我的答案。 – Alex

+0

令人驚歎的工作亞歷克斯 –

0

MySQL工作臺有一個名爲mysqldbcompare的實用程序,它比較兩個數據庫之間的差異。 差異輸出可能是一個csv或者簡單地可以是sql語句,因此您可以將這些DML運行到您的開發環境。

SQL輸出將是完整的DML語句(CREATE TABLE/INSERT STATEMENTS),以便您的目標數據庫看起來像源一樣。

在思想上是這樣的:

$ mysqldbcompare --server1=root:[email protected] \ 
    --server2=root:[email protected] db1:db2 --changes-for=server1 -a \ 
    --difftype=sql 
0

當然使用左連接這將從INFORMATION_SCHEMA返回數據的發展模式上市的表不是在生產模式。

SELECT * 
FROM information_schema.tables A 
LEFT JOIN information_Schema.tables B 
    on A.Table_Name = B.Table_Name 
    and B.table_Schema = 'production' 
    and A.Table_Schema = 'development' 
Where B.Table_Schema is null 
+0

我試過,但輸出是錯誤代碼:1054.'on子句' –

+0

中的未知列'B.TableName'有一個錯字應該是b.table_name。 – xQbert