在增量部署系統的時候, 經常需要提供增量修改的腳本, 如果是修改存儲過程或者自定義函數, 那還是很好改的, 不用擔心表功能收到影響. 如果是改欄位呢? 首先不知道欄位是不是已經在系統裡面, 沒有的話, 需要新增上去, 有的話, 需不需要修改? 其次, 腳本如果報錯, 是否會重覆執行一下腳本? 會不會 ...
在增量部署系統的時候, 經常需要提供增量修改的腳本, 如果是修改存儲過程或者自定義函數, 那還是很好改的, 不用擔心表功能收到影響.
如果是改欄位呢?
首先不知道欄位是不是已經在系統裡面, 沒有的話, 需要新增上去, 有的話, 需不需要修改?
其次, 腳本如果報錯, 是否會重覆執行一下腳本? 會不會導致別的問題呢? 看腳本裡面執行結果報了好多錯, 總覺得, 會被運維鄙視一遍. 做開發的, 真受不了別人鄙視自己的東西.
直接用sql去新增, 修改欄位, 好像不太行, 經常會有問題.
正所謂, 條條大路通羅馬. 一條路走不通, 我們換一條路走吧.
那麼, 換一種思路, 不直接用表操作sql去改欄位, 而是通過存儲過程的方式來改. 對欄位進行判斷, 再修改, 那麼你提供的腳本就是可重覆執行腳本, 且不會報錯.
delimiter $ drop procedure if exists pro_put_column; create procedure pro_put_column() BEGIN if not exists(select * from information_schema.COLUMNS where TABLE_SCHEMA=database() and table_name='表名' and COLUMN_NAME='欄位名') THEN alter table 表名 add column 欄位名 varchar(50); ELSE alter table 表名 MODIFY COLUMN 欄位名 varchar(51); end if; END $ delimiter ;
call pro_put_column();
可以先查詢欄位是否存在, 再決定要不要加, 或者要不要改. 後面的邏輯, 就根據實際需要去修改就可了.
如果確定是新增欄位, 那麼else部分完全可以刪除掉.
就是每改一個欄位, 都要去查詢一次, 有點不方便. 寫的東西更多了.