我正在尝试更新数据库上大多数表中存在的列(在本例中为日期)。遗憾的是,我的数据库已经创建了100多个表,并且充满了信息。有没有办法循环使用它们只是使用:
-g
循环上的?
答案 0 :(得分:5)
一个无痛的选择是创建一个查询,生成要在所有表上运行的UPDATE
语句:
SELECT CONCAT('UPDATE ', a.table_name, ' SET date = "2016-04-20" WHERE name = "Example";')
FROM information_schema.tables a
WHERE a.table_schema = 'YourDBNameHere'
您可以复制此查询的输出,将其粘贴到查询编辑器中,然后运行它。
<强>更新强>
正如@PaulSpiegel所指出的,如果使用HeidiSQL等编辑器,上述解决方案可能会不方便,因为它需要手动复制结果集中的每条记录。使用GROUP_CONCAT()
使用技巧会在其中提供包含每个所需UPDATE
个查询的单个字符串:
SELECT GROUP_CONCAT(t.query SEPARATOR '; ')
FROM
(
SELECT CONCAT('UPDATE ', a.table_name,
' SET date = "2016-04-20" WHERE name = "Example";') AS query,
'1' AS id
FROM information_schema.tables a
WHERE a.table_schema = 'YourDBNameHere'
) t
GROUP BY t.id
答案 1 :(得分:3)
您可以使用SHOW TABLES
命令列出数据库中的所有表。接下来,您可以使用SHOW COLUMNS
命令检查表中是否显示列。它可以这样使用:
SHOW COLUMNS FROM `table_name` LIKE `column_name`
如果此查询返回结果,则列存在,您可以对其执行UPDATE
查询。
您可以在sqlfiddle上查看此过程。
CREATE PROCEDURE UpdateTables (IN WhereColumn VARCHAR(10),
IN WhereValue VARCHAR(10),
IN UpdateColumn VARCHAR(10),
IN UpdateValue VARCHAR(10))
BEGIN
DECLARE Finished BOOL DEFAULT FALSE;
DECLARE TableName VARCHAR(10);
DECLARE TablesCursor CURSOR FOR
SELECT c1.TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS c1
JOIN INFORMATION_SCHEMA.COLUMNS c2 ON (c1.TABLE_SCHEMA = c2.TABLE_SCHEMA AND c1.TABLE_NAME = c2.TABLE_NAME)
WHERE c1.TABLE_SCHEMA = DATABASE()
AND c1.COLUMN_NAME = WhereColumn
AND c2.COLUMN_NAME = UpdateColumn;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET Finished = TRUE;
OPEN TablesCursor;
MainLoop: LOOP
FETCH TablesCursor INTO TableName;
IF Finished THEN
LEAVE MainLoop;
END IF;
SET @queryText = CONCAT('UPDATE ', TableName, ' SET ', UpdateColumn, '=', QUOTE(UpdateValue), ' WHERE ', WhereColumn, '=', QUOTE(WhereValue));
PREPARE updateQuery FROM @queryText;
EXECUTE updateQuery;
DEALLOCATE PREPARE updateQuery;
END LOOP;
CLOSE TablesCursor;
END
这只是一个如何遍历数据库中的所有表并使用它们执行某些操作的示例。程序可以根据您的需要进行更改。
答案 2 :(得分:0)