3

MySQL根据表前缀批量修改、删除表

 2 years ago
source link: https://xushanxiang.com/mysql-operation-batch-table-prefixes.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

注意:请先调试好,以及做好备份,再执行操作。

批量修改表

批量给前缀为 xushanxiang_content_ 的表增加一个 username 的字段:

SELECT CONCAT('ALTER TABLE ',table_name,' ADD username varchar(40) NULL COMMENT "用户名";') FROM information_schema.TABLES WHERE table_name LIKE 'xushanxiang\_content\_%';

可以得到下面一些 SQL 语句列表,也就是生成了批量修改表的语句:

Batch-modification-table.png

之后,我们再批量执行这些 SQL 语句即可。

友情提示:在 phpMyAdmin 如果语句过长, CONCAT 结果会像上图隐去后面的内容,你只需要在结果上面点击“选项”,选中“完整内容”,再点击“ 执行 ”即可。如下图:

mysql-concat-showall.png

批量执行语句

方式一、存储过程 while 循环

# 参考代码:
DROP PROCEDURE IF EXISTS canal_test; # 删除存储过程

DELIMITER // # 设置分割符1
CREATE PROCEDURE canal_test()
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i<=10 DO
   update users set mileage=i;
SET i = i+1;
END WHILE;
END
//
DELIMITER; # 设置分割符2

CALL canal_test(); # 调用存储过程

方式二、source 命令

待执行的 sql 文件为1.sql、2.sql、3.sql、4.sql等, 写一个batch.sql文件:

source 1.sql;
source 2.sql;
source 3.sql;

在 mysql 下执行 source batch.sql; (注意路径)

如果只有一个 SQL 文件,例如 mysqltest.sql 脚本在 D 盘根目录, 进入 MySQL 的命令行窗口,直接输入如下命令即可批量执行脚本中的 sql 语句【 注:结尾不带分号执行 】

source D:\mysqltest.sql

方式三、在网站程序里动态执行

// 参考用例,可能和您的实际情况不一样
$sqlArr = $this->model->all("SELECT CONCAT('ALTER TABLE ',table_name,' ADD username varchar(40) NULL COMMENT \'用户名\';') FROM information_schema.TABLES WHERE table_name LIKE 'xushanxiang\_content\_%';");
// 得到一个SQL语句的数组;
foreach ($sqlArr as $key => $value) {
    foreach ($value as $k => $v) {
        $this->model->amd($v); // 依次执行sql
    }
}

参考 sql 如下:

SELECT CONCAT('drop table ',table_name,';') FROM information_schema.TABLES WHERE table_name LIKE 'xushanxiang\_content\_%';

接着,参考上面的进行批量执行即可。

题外话,既然说到对数据表进行批量操作,那可能少不了数据表的复制。

数据表的复制

只复制表结构到新表

create table 新表 like 旧表

复制表结构及数据到新表

create table 新表 select * from 旧表

复制一条数据到结构相同的表

INSERT INTO content_1 SELECT * FROM content_0 WHERE id=1

复制部分字段到另一个表

INSERT INTO table2 ( name , price ) SELECT name , price  FROM table1  WHERE id=5

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK