MySQL使用存儲過程批量更新數據庫所有表某個字段值


最近響應群里朋友完整開源之前那個博客系統,准備重構一番項目的代碼,對數據庫中的表決定都添加 create_by、update_by、create_time、update_time、del_flag 等字段。 當時添加表的時候沒有設置默認值,現在要對二三十張表某個字段,如對 del_flag 設置默認值為0,怎么做呢?一張表一張表地設置比較蠢,如何實現批量操作呢?比如查出所有的表名,然后來一個循環操作。是的,沒錯,可以使用存儲過程。 下面是對 sens_blog 這個庫的所有的表中的 del_flag 設置默認值的示例

 
  1. -- 如果存儲過程存在就刪除
  2. DROP PROCEDURE IF EXISTS updateColumn;
  3. CREATE PROCEDURE updateColumn()
  4. BEGIN
  5. -- 定義循環條件
  6. DECLARE flag INT DEFAULT 0;
  7. -- 保存表名
  8. DECLARE tname VARCHAR(50);
  9. -- 查詢數據庫sens_blog中含有del_flag列的表,如果區分大小寫使用binary COLUMN_NAME = 'del_flag'
  10. DECLARE result CURSOR FOR SELECT TABLE_NAME FROM  INFORMATION_SCHEMA.Columns WHERE TABLE_SCHEMA = 'sens_blog' AND  COLUMN_NAME = 'del_flag';
  11. -- 退出循環
  12. DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET flag = 1;
  13. -- 打開游標
  14. OPEN result;
  15.     WHILE flag <> 1 DO
  16.     -- 游標指向下一個位置,可以有多個數據,比如FETCH result INTO tname,ttype,...;
  17.     FETCH result INTO tname;
  18.         -- 拼接字符串表名sql,根據需要使用CONCAT函數連接
  19.         -- 批量設置所有表的為del_flag字段0
  20.         -- SET @execSql = CONCAT('UPDATE ', tname, ' SET del_flag = 0'); 
  21.                 -- 批量設置所有表的為del_flag字段默認值為0
  22.                 SET @execSql = CONCAT('ALTER TABLE  ', tname, ' ALTER COLUMN del_flag SET DEFAULT  0');
  23.         PREPARE stmt FROM @execSql;
  24.         EXECUTE stmt;
  25.     END WHILE;
  26. END;
  27. -- 調用存儲過程更新數據
  28. CALL updateColumn();

 

如果你想做其他的操作,只需要修改22行,改成你的SQL語句就行,當然數據庫名和字段名也要改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM