Mysql存储过程可以改变多个表的结构



我正在构建一个小脚本作为函数或存储过程,以便能够仅在没有名为"address"的列的表中更改表结构。

如果表没有列地址,那么脚本将添加它:

ALTER TABLE XXXX ADD COLUMN address VARCHAR(150) NULL after command;

到目前为止,我已经找到了通过查询information_schema.COLUMNS表来访问其结构上具有列"address"的表列表的方法;这样的东西并不是我所需要的,因为我需要的恰恰相反,即表列表的结构上并没有名为"address"的列。

所以基本上是一个需要做这样事情的脚本:

ALTER TABLE 
(SELECT TABLE_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'mydatabase' 
AND TABLE_NAME LIKE 'mytable_%' AND COLUMN_NAME = 'address') 
ADD COLUMN IF NOT EXISTS address  VARCHAR(150) NULL after command;

我需要这样的东西,它需要验证列名地址,只有当列不存在时,它才会尝试添加列,否则它将返回异常,查询将终止。

PHP或任何其他编程语言都不能使用,因为超过4000个表将被升级,http请求将在数据库完成操作之前终止。

另一种可能性是,在名为"address"的列存在的情况下,只处理异常——无论异常是否返回,都能够继续操作,只继续执行查询,这样就可以更新没有异常的表。。。。

您必须为此构建动态SQL。最好的办法是做这个

OOTOMH代码

Select 'Alter table ' + TableName ' + Add Address VarChar (150)'
From Information_schema.Tables T
Where Not Exists
(
Select 1
From Information_schema.Columns C
Where C.TableName = T.TableName
And C.ColumnName = 'Address'
)

既然已经生成了代码,就可以手动执行了。

如果这不是你每天都要做的事情,那么就不需要部署存储过程了,是吗?

如果你真的很想要它,那么你有很多选择-将字符串添加到变量中,用光标循环遍历集合,等等。

最新更新