ALTER来自同一查询中多个表的列

时间:2014-05-13 12:32:07

标签: mysql sql

有没有办法在一个查询中的多个表中更改具有相同列类型的相同列名?

类似的东西:

ALTER TABLE 
(SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'data_by_%_month_%'
AND TABLE_SCHEMA='db_name') 
MODIFY column1 INT(20) NOT NULL;

3 个答案:

答案 0 :(得分:1)

不,不仅仅是ALTER TABLE。期望ALTER TABLE语句接收一个表。

the docs。它不期望在那里表达。

您当然可以编写一个程序,根据您的ALTER TABLE查询创建多个SELECT语句。

答案 1 :(得分:0)

您可以使用存储过程执行此操作。

示例

测试表结构

drop table if exists so.tbl_so_q23631366_1;
drop table if exists so.tbl_so_q23631366_2;

create table so.tbl_so_q23631366_1( column1 varchar(10) );
create table so.tbl_so_q23631366_2( column1 text );

存储过程

drop procedure if exists modify_column;
delimiter //
create procedure modify_column()
begin
  declare no_more_to_fetch boolean default false;
  declare alter_table_string varchar(1024) default '';
  declare alter_stmts_crsr cursor for 
    select concat( 'alter table ', table_name
                   , ' modify column1 INT(20) NOT NULL default 0;' )
      from  information_schema.tables
     where  table_name like 'tbl_so_q23631366%' -- 'data_by_%_month_%'
       and  table_schema='so'; -- 'db_name';

  declare continue handler for not found 
      set no_more_to_fetch = true;

  open alter_stmts_crsr;
  Result_Set: loop
    fetch alter_stmts_crsr into alter_table_string;
    if( no_more_to_fetch ) then
      leave Result_Set;
    end if;

    -- un comment following line to debug
    -- select alter_table_string;

    set @sql := alter_table_string;
    prepare stmt from @sql;
    execute stmt;
    drop prepare stmt;
  end loop Result_Set;
  close alter_stmts_crsr;
end;
//
delimiter ;

调用存储过程

call modify_column;

请参阅修改后的表格结构

desc tbl_so_q23631366_1; desc tbl_so_q23631366_2;

答案 2 :(得分:-2)

没有。您只能在ALTER TABLE子句中列出一个表名,但您可以更改表中的多个项:

来自MySQL docs on ALTER

  

ALTER TABLE t2 DROP COLUMN c,DROP COLUMN d;