如何快速的進行sql指令碼升級
sql指令碼升級即從一個老的指令碼升級到一個新的全量的指令碼。比如公司有某一個專案,有的客戶已經用這個專案了,資料庫裡面去掉以前的初始化資料外,現在還有了客戶自己的資料。但是這個版本中有嚴重的bug,所以為了讓最新的war包適配以前資料庫,必須對以前的資料庫進行升級。在這裡指令碼升級以mysql指令碼升級到mysql指令碼(mysql升級到oracle,oracle升級到mysql這裡沒有考慮)
在升級指令碼的過程中我們的已知條件是:以前老版本的初始化指令碼(包括建立表,初始化資料)這裡用A表示,還有新版本的初始化指令碼(包括建立表,初始化資料)這裡用B表示。所以升級指令碼(B-A)
我們已知B-A的內容可能有新增了的一些表,一些索引,一些檢視等等。還有多了很多初始化資料。
如果我們直接用肉眼未免太慢,也不保險。
所以必須通過其他方式解決。
第一步:看新指令碼中比老指令碼中多了哪些表,哪些索引:
sql語句是:其中TABLE_SCHEMA='A'或者TABLE_SCHEMA='B'就是我們常講的資料庫名。這個sql檢查的是A庫中比B庫中多的表。
select * from (select table_name from information_schema.`TABLES` where TABLE_SCHEMA='A') a where a.table_name not in (select table_name from information_schema.`TABLES` where TABLE_SCHEMA='B');
select * from (select index_name from information_schema.STATISTICS where TABLE_SCHEMA='B') a where a.index_name not in (select index_name from information_schema.STATISTICS where TABLE_SCHEMA='B');
第二步是看新指令碼中的表結構是否改變,也就是是否在一個表中增加了一列,或者減少了一列,或者某列的資料型別和長度改變了。
查詢資料庫A的每張表中的列數
設A=select a.table_name,count(a.column_name) column_count from information_schema.columns a
where table_schema = 'A'
group by a.table_name order by a.table_name;
查詢資料庫B的每張表中的列數
設B:select a.table_name,count(a.column_name) column_count from information_schema.columns a
where table_schema = 'A'
group by a.table_name order by a.table_name;
則查詢的語句是:
select * from A LEFT JOIN B on A.table_name=B.table_name;
把上面的A和B代入得到總的sql語句,sql語句如下所示:
select * from (select a.table_name,count(a.column_name) column_count from information_schema.columns a
where table_schema = 'thailand'
group by a.table_name order by a.table_name) A LEFT JOIN (select a.table_name,count(a.column_name) column_count from information_schema.columns a
where table_schema = 'thailand'
group by a.table_name order by a.table_name) B on A.table_name=B.table_name;
查詢的結果如下圖所示:
通過這兩個sql語句,可以為我們升級指令碼減少一些時間。