2017-08-01 47 views
0

我有一个共享服务器,我有50到60个数据库,每个数据库有200个表。MySQL - 如何通过单一操作更改所有数据库上的列?

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

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; 
+0

你不可能真的。您可以将数据库导出为文本文件,然后在应用程序代码中对其进行编辑,但它可能会损坏数据集,所以我只会尝试使用备份。 – Strawberry

+1

200是相当多的表格 – Strawberry

回答

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

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脚本。

相关问题