Обновление всех строк определенного столбца в каждой таблице определенной базы данных (Mysql) - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь обновить все строки столбца в каждой таблице в моей базе данных.Мой текущий 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;

Пятница - одна из таблиц в базе данныхЯ уточнил.Проблема в том, что когда я запускаю это, никакие изменения не вносятся в сами таблицы.Если бы я должен был взять одну из команд, которые вывела моя конкатенация, и запустить ее, то это повлияло бы на таблицу.Я немного новичок в использовании 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 ;

1 Ответ

0 голосов
/ 23 июня 2019

Вот решение, которое я придумал. Спасибо за тех, кто прокомментировал и указал мне в правильном направлении. Если кому-то потребуется обновить каждый столбец в базе данных в будущем, вот что я сделал:

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 ; 
...