MySQL - 如何通过单个操作更改所有数据库上的列?

时间:2017-08-01 07:15:27

标签: mysql database

我有一个共享服务器,我有50到60个数据库,每个数据库有200个表。

如何一次性在所有现有数据库中添加少量新列而不是手动添加一个数据库?

ALTER TABLE  `users` ADD  `a` VARCHAR( 200 ) NULL;
ALTER TABLE  `users` ADD  `b` VARCHAR( 200 ) NULL;
ALTER TABLE  `users` ADD  `c` VARCHAR( 200 ) NULL;
ALTER TABLE  `users` ADD  `d` VARCHAR( 200 ) NULL;
ALTER TABLE  `users` ADD  `e` VARCHAR( 200 ) NULL;
ALTER TABLE  `users` ADD  `f` VARCHAR( 200 ) NULL;

2 个答案:

答案 0 :(得分:1)

您可以为其创建程序。在程序中,您可以在此查询上写入光标。

select TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='sampledata';

使用Dynamic Query制作动态 ALTER 语句:

DELIMITER $$
CREATE PROCEDURE `SAMPLEPROCEDURE`(IN COLUMNNAME VARCHAR(40))
BEGIN
DECLARE VAR_TABLENAME VARCHAR(100);
DECLARE DONE  INT;

DECLARE CUR CURSOR FOR 
        SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'SAMPLEDATA';

DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE=1;

SET DONE = 0;
    OPEN CUR;
    TABLELOOP: LOOP
        FETCH CUR INTO VAR_TABLENAME;
        IF DONE = 1 THEN LEAVE TABLELOOP; END IF;
SET @VAR_ALTER_QUERY =CONCAT("ALTER TABLE ",VAR_TABLENAME," ADD ",COLUMNNAME," VARCHAR(200) NULL");

 PREPARE STMT FROM @VAR_ALTER_QUERY;
 EXECUTE STMT;
 DEALLOCATE PREPARE STMT;

    END LOOP TABLELOOP;

END

您可以采用上述程序作为参考。

答案 1 :(得分:1)

use information_schema select case when table_schema is not null then CONCAT("USE ",TABLE_SCHEMA) end use_schema , CONCAT("Alter Table '", TABLE_SCHEMA,"'.'", TABLE_NAME, " Add 'a' varchar(200)") as MySQLCMD from TABLES where table_name = 'USERS';

关键是您可以使用字典模式从每个模式中检索每个“用户”表并生成ALTER脚本。