更新特定数据库(Mysql)每个表中特定列的所有行

更新特定数据库(Mysql)每个表中特定列的所有行,mysql,sql-update,concat,Mysql,Sql Update,Concat,我正在尝试更新数据库中每个表中列的所有行。我当前的SQL如下所示: SELECT CONCAT('UPDATE `', a.table_name, '` SET columnName = NULL;') FROM information_schema.tables a WHERE a.table_schema = 'databaseName' 运行此命令时,会运行一系列命令,例如: UPDATE `Friday` SET columnName = NULL; Friday是我指定的数据

我正在尝试更新数据库中每个表中列的所有行。我当前的SQL如下所示:

SELECT CONCAT('UPDATE `', a.table_name, '` SET columnName = NULL;')
FROM information_schema.tables a
WHERE a.table_schema = 'databaseName'   
运行此命令时,会运行一系列命令,例如:

UPDATE `Friday` SET columnName = NULL;
Friday是我指定的数据库中的表之一。问题是,当我运行此命令时,表本身不会发生任何更改。如果我接受连接输出的命令之一并运行它,那么表就会受到影响。我对使用MySQL有些陌生,那么为什么串联的一系列命令与单个命令运行会改变效果呢?对于我要实现的目标,初始命令的格式是否不正确?谢谢你的帮助

编辑:在评论和发布的文档之后,这里是我所在位置的更新

SET @s:='';
SELECT @s:=concat(@s, 'UPDATE TABLE ', a.TABLE_SCHEMA,'.`',  a.TABLE_NAME, '` SET columnName = NULL;') FROM INFORMATION_SCHEMA.TABLES a where table_schema = 'databaseName';    
PREPARE stmt FROM @s;
EXECUTE stmt;

DEALLOCATE PREPARE stmt;
只要仔细阅读文档,就会发现准备好的语句不能处理多个语句。调查程序

编辑:

这里有一点接近我试图实现的目标。不过,我还有一些错误需要解决

    DELIMITER $$

DROP PROCEDURE IF EXISTS myproc $$

CREATE PROCEDURE myproc() 
NOT DETERMINISTIC
MODIFIES SQL DATA
BEGIN

DECLARE done tinyint(1) DEFAULT FALSE;
DECLARE sql2 VARCHAR(2000);

DECLARE csr CURSOR FOR 
SELECT CONCAT('UPDATE `',c.table_schema,'`.`',c.table_name,'` SET `columnName` = NULL') AS sql2
    FROM information_schema.columns c
   WHERE c.column_name = 'columnName'
     AND c.table_schema IN ('databaseName');
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN csr;
  do_foo: LOOP
     FETCH csr INTO sql2;
     IF done THEN
        LEAVE do_foo;
     END IF;
     PREPARE stmt FROM sql2;
     EXECUTE stmt;
     DEALLOCATE PREPARE stmt;
  END LOOP do_foo;
  CLOSE csr;

  END$$

DELIMITER ;

这是我想出的解决办法。感谢那些评论我并为我指出正确方向的人。如果将来有人需要更新数据库中的每一列,我会这样做:

DELIMITER $$

DROP PROCEDURE IF EXISTS myproc $$

CREATE PROCEDURE myproc() 
NOT DETERMINISTIC
MODIFIES SQL DATA
BEGIN

DECLARE done tinyint(1) DEFAULT FALSE;
DECLARE sql2 VARCHAR(2000);

DECLARE csr CURSOR FOR 
SELECT CONCAT('UPDATE ',c.table_schema,'.`',c.table_name,'` SET columnName = NULL') AS sql2
    FROM information_schema.columns c
   WHERE c.column_name = 'columnName'
     AND c.table_schema IN ('databaseName');
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN csr;
  do_foo: LOOP
     FETCH csr INTO sql2;
     IF done THEN
        LEAVE do_foo;
     END IF;

     SET @newTest = sql2;
     PREPARE stmt FROM @newTest;
     EXECUTE stmt;
     DEALLOCATE PREPARE stmt;
  END LOOP do_foo;
  CLOSE csr;

  END$$

DELIMITER ; 

根本不清楚观察到的是什么行为。说“没有对表进行任何更改”和“表随后受到影响”在确定正在使用的客户端时实际上是无用的;使用什么机制从SELECT获取结果集,并将这些字符串作为SQL语句执行。运行该SELECT语句只返回一个结果集。CONCAT表达式的结果是什么并不重要;它恰巧看起来像SQL文本;没什么区别。(SELECT只是返回一列数据类型VARCHAR。)重申一下,当您将SELECT语句提交给MySQL服务器执行时,该语句成功完成,MySQL服务器返回一个结果集。通常,客户端从resultset中获取行,并将它们显示为命令行客户端的文本。(就客户端而言,返回的不是“一系列命令”。返回的是一个结果集,如一个表、一个集合或由一列数据类型VARCHAR组成的行。)@spencer7593对于使用MySQL感到抱歉。是,然后在使用我发布的sql代码段时返回结果集。我假设它将以类似于普通sql语句的方式运行它们。我应该如何运行resultset中的每个结果?我的最终目标是在计划的事件中运行所有这些语句。有没有办法循环遍历resultlist并在mysql事件中执行每条语句?我想您需要创建更新语句并将它们提交给mysql。要循环遍历所有表,请将代码放入存储过程中。顺便问一下,在所有要更新的表中是否都有一个名为columnname的列?