Mysql表结构升级_mysql表结构升级时根据字段是否存在执行相应操作
【問題描述】
某信息系統,使用MYSQL做數據庫服務,版本5.0.45,在準備對表結構進行升級時,使用sql腳本對表結構進行更改,包括增加列、更改列等操作,為防止重復運行升級腳本而出現錯誤,擬在進行alter?? table?? 之前檢測某一字段是否存在,如:
1、添加列,則要檢測該列是否存在,如果不存在才進行add操作,否則不執行任何操作;
2、更改列,檢測該列是否存在,如果存在則更新,否則添加該列;
3、刪除列,檢測該列是否存在,存在才執行操作
【初步實現方法】
1、編寫自定義函數,檢測某個表或某個字段是否存在,從系統數據庫?? `information_schema`.`COLUMNS`?? 里查詢
2、編寫存儲過程,在其中調用該函數查詢某表或某表的某字段是否存在,并根據查詢結果執行操作
【代碼示例】
[code=SQL]
DELIMITER?? $$
DROP?? FUNCTION?? IF?? EXISTS?? `db_waasai`.`CheckIsObjectExist`$$
CREATE?? FUNCTION?? `db_waasai`.`CheckIsObjectExist`(table_name?? VARCHAR(50),colume_name?? varchar(50))
RETURNS?? BOOLEAN
BEGIN
DECLARE?? t_count?? TINYINT?? UNSIGNED;
SELECT?? count(0)?? INTO?? t_count?? FROM?? information_schema.COLUMNS?? where?? TABLE_NAME=table_name?? &&?? (isnull(colume_name)?? ||?? colume_name= ' '?? ||?? COLUMN_NAME=colume_name);
RETURN?? t_count> 0;
END$$
DROP?? PROCEDURE?? if?? EXISTS?? `db_waasai`.`sp_update_106_107`?? $$
CREATE?? PROCEDURE?? `db_waasai`.`sp_update_106_107`()
BEGIN
IF?? NOT?? CheckIsObjectExist( 'tbl_user_card ', ' ')?? THEN
CREATE?? TABLE?? `tbl_user_card`?? (
`u_id`?? SMALLINT(6)?? UNSIGNED?? NOT?? NULL?? AUTO_INCREMENT,
`u_status`?? TINYINT(1)?? UNSIGNED?? DEFAULT?? '0 ',
`u_name`?? VARCHAR(20)?? NOT?? NULL,
PRIMARY?? KEY???? (`u_id`)
)?? ENGINE=MyISAM?? DEFAULT?? CHARSET=utf8?? CHECKSUM=1?? DELAY_KEY_WRITE=1?? ROW_FORMAT=DYNAMIC;
END?? IF;
IF?? NOT?? CheckIsObjectExist( 'tbl_user ', 'u_cards_num ')?? THEN
alter?? table?? `tbl_user`?? add?? column?? `u_cards_num`?? int?? (12)?? UNSIGNED???? DEFAULT?? '0 '?? NULL???? after?? `u_age`;
update?? `tbl_user`?? set?? `u_cards_num`=1;
END?? IF;
END$$
DELIMITER?? ;
CALL?? sp_update_106_107();
DROP?? PROCEDURE?? IF?? EXISTS?? `lsgw`.`sp_update_106_107`;
[/code]
【引玉】
這只是我實現目的的方法,之前也嘗試過用?? if?? exists?? 之類的,但是始終沒有成功,希望有朋友能夠提供更簡單、高效的方法
【說明】
示例代碼是根據實際運行成功的代碼改寫的,并不保證完全可用,hoho
修改了下,支持UBB
[code=SQL]
DELIMITER $$
DROP FUNCTION IF EXISTS `db_waasai`.`CheckIsObjectExist`$$
CREATE FUNCTION `db_waasai`.`CheckIsObjectExist`
總結
以上是生活随笔為你收集整理的Mysql表结构升级_mysql表结构升级时根据字段是否存在执行相应操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 产生阻滞的问题 net4.6_识别左束支
- 下一篇: jboss mysql cluster_