mysql设置所有表的一个一段_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 :指定的参数名

结果如图:

9562434ccdcb3d0b00e51de56da7593c.png

使用存储过程批量修改数据库中某个字段的值

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、执行结果:

25b7e1394b2bfcab90f9310b8d695cdb.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值