MySQL使用儲存過程為資料庫中全部的表增加備用欄位
阿新 • • 發佈:2018-12-26
需求描述
要為資料庫裡的所有的表統一加上十六個備用欄位,前提是備用欄位名取表名前三位,拼接上備用1-16 ,
16個欄位中,其中8個varchar, 4個int, 4個datetime
1.建立一個簡單的表
DROP TABLE customer_detail_info; CREATE TABLE `customer_detail_info` ( `cus_id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`cus_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 查看錶結構 DESC customer_detail_info;
表結構截圖:
2.建立一個儲存過程
DROP PROCEDURE IF EXISTS `procedure_update_table`; DELIMITER ;; CREATE PROCEDURE `procedure_update_table`(IN table_name VARCHAR(50)) BEGIN declare i int; DECLARE sq VARCHAR(8000); SET i = 1 ; WHILE i < 17 DO -- 取表名前三位 set @qz = LEFT(table_name,3); -- 拼接欄位名 set @pp = CONCAT(@qz,i); -- 前八個字元型別 IF i < 9 THEN SET sq = CONCAT('ALTER table ',table_name,' add column ',@pp, ' VARCHAR(8) '); -- 中間四個int ELSEIF (i > 8 && i < 13) THEN SET sq = CONCAT('ALTER table ',table_name,' add column ',@pp, ' INT(11)'); -- 其他的時間型別 ELSE SET sq = CONCAT('ALTER table ',table_name,' add column ',@pp, ' DATETIME '); end IF; SET i = i + 1 ; SET @_SQL = sq ; -- 預定義sql PREPARE stmt FROM @_SQL ; -- 執行sql EXECUTE stmt ; -- 釋放連線 DEALLOCATE PREPARE stmt; -- 結束While 迴圈 END WHILE; END;
3.整個庫中全部表獲取的儲存過程
-- 已存在的儲存刪除 DROP PROCEDURE IF EXISTS procedure_get_all_tables; DELIMITER ;; CREATE PROCEDURE procedure_get_all_tables() BEGIN -- 用於判斷是否結束迴圈 DECLARE done int DEFAULT 0; -- 儲存表名稱的變數 DECLARE cur VARCHAR(200); DECLARE tbs_list CURSOR FOR SELECT TABLE_NAME FROM information_schema.`TABLES` WHERE TABLE_Schema = 'hqh_log'; -- 定義 設定迴圈結束標識done值怎麼改變 的邏輯 declare continue handler for not FOUND set done = 1; OPEN tbs_list; -- 迴圈開始 REPEAT FETCH tbs_list INTO cur; if not done THEN CALL procedure_update_table(cur); end if; until done end repeat; CLOSE tbs_list; END;
4.執行儲存過程
-- 呼叫儲存過程
CALL procedure_get_all_tables();
-- 查看錶結構
DESC customer_detail_info;
給大家在提供一個mybatis呼叫儲存過程的例子