mysql查詢和修改指定數據庫中所有表中包含的某個字段

前奏

最近遇到一個業務場景,就是在某個特定的操作中,需要把兩個用戶信息合併成一個用戶信息,剛遇到的時候沒思路,後來理了半天,稍微有點思路。

一個廢棄的思路

1、先更改user表,把兩個用戶信息合併成一個,這個簡單

2、查詢當前庫中所有包含userId的表

3、把舊的userId做條件,來對真個庫包含userID的表進行數據修改

吐槽自己:很遺憾的這個思路最後並沒有走通,因爲每個用戶涉及的一個積分的運算,這一塊數據合併處理的時候並不符合邏輯。所以這種思路最終放棄,之所寫這邊筆記,是因爲中間有兩個小知識點可以記錄一下

查詢指定數據庫中包含某一字段的所有表

sql如下:

SELECT

 TABLE_NAME '表名',

 COLUMN_NAME '字段'

FROM

 information_schema. COLUMNS

WHERE

 TABLE_SCHEMA = 'pre-read'

AND COLUMN_NAME = 'userId'

 

1、TABLE_NAME :表名

2、COLUMN_NAME :列名(字段)

3、information_schema:mysql自帶庫,裏面都是mysql的元數據,元數據指的是數據的數據,有點繞,該數據庫裏面存的就是數據庫的名稱、列的數據類型、訪問權限等

4、TABLE_SCHEMA :指定的數據庫

5、COLUMN_NAME :指定的參數名

結果如圖:

使用存儲過程批量修改數據庫中某個字段的值

1、存儲過程:

-- 如果存儲過程存在就刪除
DROP PROCEDURE IF EXISTS userId;
CREATE PROCEDURE userId(IN oldUserId CHAR(15),IN newUserId CHAR(15))
BEGIN
-- 定義循環條件
DECLARE flag INT DEFAULT 0; 
-- 保存表名
DECLARE tname VARCHAR(50);
-- 查詢數據庫test中含有userId列的表,如果區分大小寫使用binary COLUMN_NAME = 'userId'
DECLARE result CURSOR FOR SELECT TABLE_NAME FROM  INFORMATION_SCHEMA.Columns WHERE TABLE_SCHEMA = 'test' AND  COLUMN_NAME = 'userId';
-- 退出循環
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET flag = 1; 
-- 打開遊標
OPEN result;
    WHILE flag <> 1 DO
    -- 遊標指向下一個位置,可以有多個數據,比如FETCH result INTO tname,ttype,...;
    FETCH result INTO tname;
        -- 拼接字符串表名sql,根據需要使用CONCAT函數連接
        -- SET @execSql = CONCAT('SELECT * FROM  ',tname,' WHERE imei = ',oldImei,' ;'); 
        SET @execSql = CONCAT('UPDATE ', tname, ' SET userId =  ',newUserId,' WHERE userId = ',oldUserId,' ;'); 
        PREPARE stmt FROM @execSql;
        EXECUTE stmt;
    END WHILE;
END;
-- 調用存儲過程更新數據
CALL userId('2058661094','123456');

 

2、執行結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章