更新特定数据库 (Mysql) 的每个 table 中特定列的所有行
Updating all rows of a particular column in every table of a specific database (Mysql)
我正在尝试更新数据库中每个 table 列的所有行。我当前的 SQL 如下所示:
SELECT CONCAT('UPDATE `', a.table_name, '` SET columnName = NULL;')
FROM information_schema.tables a
WHERE a.table_schema = 'databaseName'
当我 运行 这个命令时,我得到一系列命令 运行ning 例如:
UPDATE `Friday` SET columnName = NULL;
星期五是我指定的数据库中的 table 之一。问题是,当我 运行 这样做时,table 本身没有任何变化。如果我要采用我的串联输出的命令之一并 运行 它, table 然后会受到影响。我对使用 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 ;
我正在尝试更新数据库中每个 table 列的所有行。我当前的 SQL 如下所示:
SELECT CONCAT('UPDATE `', a.table_name, '` SET columnName = NULL;')
FROM information_schema.tables a
WHERE a.table_schema = 'databaseName'
当我 运行 这个命令时,我得到一系列命令 运行ning 例如:
UPDATE `Friday` SET columnName = NULL;
星期五是我指定的数据库中的 table 之一。问题是,当我 运行 这样做时,table 本身没有任何变化。如果我要采用我的串联输出的命令之一并 运行 它, table 然后会受到影响。我对使用 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 ;