我尝试了很多线索,但无法找到对我有用的东西。
我有一个包含表名列表的文本文件(架构中300个表中约有100个)。
tables.txt
table1
table2
table3
我正在编写一个存储过程,想要遍历该文本文件中的表名,并在查询中注入表名。
像这样的东西
While (line = readline) != null do
update line set col1='foo' where id=x;
End while;
在存储过程中甚至可以实现这样的功能吗?使用(mysql 5.6)。我正在使用Workbench 6.3 CE
答案 0 :(得分:1)
由于您希望为数据库中的每个表运行相同的代码。您可以使用信息架构创建命令
USE INFORMATION_SCHEMA;
SELECT
CONCAT("ALTER TABLE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` ALTERING CODE HERE;")
AS MySQLCMD FROM TABLES
WHERE TABLE_SCHEMA = "your_schema_goes_here";
创建命令后,您可以复制并运行所有命令。
更新如果您想更新所有这些表之间的公共列,可以按照以下方式编写
SELECT CONCAT("UPDATE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` SET COLUMN_NAME = VALUE [ANY WHERE CLAUSE]") as MySQLCMD from TABLES where TABLE_SCHEMA = "YourSchemaName";
UPDATE2 为特定表生成命令。
SELECT
CONCAT("ALTER TABLE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` ALTERING CODE HERE;")
AS MySQLCMD FROM TABLES
WHERE TABLE_SCHEMA = "your_schema_goes_here" AND TABLE_NAME IN ('Table1', 'TAble2');
答案 1 :(得分:0)
总的来说,我会采用这种方法。没有足够的细节更具体。注意,这使用动态SQL而不是存储过程。
备份您的数据库!!
创建临时表。 (无论是真实的还是在记忆中,取决于您需要保留此数据的时间长度)
使用以下内容将文本文件解析为临时表:
LOAD DATA INFILE'/tmp/mylist.txt'INTO TABLE MyTempList;
创建一个ALTER表语句的测试。一旦你知道它完全符合预期......
将工作的ALTER语句转换为动态SQL,从临时表中选择表名。这样的事情:Alter table using sub select
完成后,您可以删除临时表。
或者,您可以将单个ALTER语句放入存储过程,并将表名称作为参数。但是,您仍然需要使用类似步骤1-3的内容来解析文本文件。然后使用游标循环遍历表名并调用存储过程。