爲了保證數據的正確性,代碼的健壯性,咱們必須對一些邊界條件作一個判斷,因此纔會把修改表結構搞得如此複雜。mysql
mysql 新增字段時判斷字段是否存在,原本是一個很小的問題,由於之前都是使用 postgreSql、sqlserver ,上來就 if not exist ,結果mysql並不吃這一套,看看這段代碼:sql
IF NOT EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't_subject' AND COLUMN_NAME = 'subject_status' )THEN ALTER TABLE t_subject ADD COLUMN `subject_status` int(1) DEFAULT '0' COMMENT '0:未被引用;1:已被用'; END IF;
在 navicat執行時總出現錯誤,納悶啊............................函數
網上查了不少,發現不能這樣直接執行腳本,那就沒辦法了,變態的寫法就是直接定義存儲過程,而後執行存儲過程,最後刪除存儲過程,看到這你是否是想呵呵了,不管怎樣,這最終是一種解決方法sqlserver
// 建立存儲過程 名稱定義 以temp開頭意爲臨時的,Alter_Table_T_Subject 意爲修改T_Subject,20160411 意爲存儲過程建立的日期post
CREATE PROCEDURE Temp_Alter_Table_T_Subject_20160411() BEGIN IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't_subject' AND COLUMN_NAME = 'subject_status') THEN ALTER TABLE t_subject ADD COLUMN `subject_status` int(1) DEFAULT '0' COMMENT '0:未引用;1:已被用'; END IF; END
// 調用存儲過程spa
CALL Temp_Alter_Table_T_Subject_20160411()
// 刪除存儲過程code
DROP PROCEDURE Temp_Alter_Table_T_Subject_20160411;
但願有更好的方式,不然這個太變態了,我是否是還要寫一個函數,來判斷這個存儲過程是否已經存在了,我去太複雜了,真誠但願有更好的方式,能夠留言!server