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