问题描述
我有一个单租户 MySQL 数据库设置。也就是说,我为每个客户端都有一个相同的架构。
现在我需要为每个客户端运行特定的查询。这在 Multi-Tenancy 设置(所有客户端共享一个模式)中很容易。然而,根据我的设置,我需要迭代模式。 更一般地说,我想访问一个名称由变量指定的模式。如何做到这一点?
我尝试过的
如果我尝试
USE varSchemaName
(其中varSchemaName
是一个varchar
变量),我收到错误消息ERROR 1314: USE is not allowed 在存储过程中。如果我尝试
SELECT * FROM varSchemaName.MyTable
我得到 错误代码:1146。表“varSchemaName.MyTable”不存在。显然 MySQL 认为 varSchemaName 是一个文字,而不是一个 变量。
最佳答案
基于 fancyPants 的答案,您可以在另一个过程的循环中调用该过程,该过程查询 information_schema.tables 以识别包含 MyTable 的数据库,然后使用数据库名称作为参数调用 fancyPants 的过程。如果数据库具有一致的命名方案或包含相同命名的对象(听起来就像这里的情况),则此方法很容易。结构类似于:
DELIMITER //
DROP PROCEDURE IF EXISTS mydriver //
CREATE PROCEDURE mydriver()
BEGIN
DECLARE varSchemaName VARCHAR(64);
DECLARE done BOOLEAN;
DECLARE cur CURSOR FOR
SELECT table_schema
FROM information_schema.tables
WHERE table_name = 'MyTable';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO varSchemaName;
IF done THEN
LEAVE read_loop;
CLOSE cur;
END IF;
CALL fancypants_proc(varSchemaName);
END LOOP;
END //
DROP PROCEDURE IF EXISTS fancypants_proc //
CREATE PROCEDURE fancypants_proc(IN varSchemaName VARCHAR(64))
BEGIN
SET @sql = CONCAT('SELECT * FROM ', varSchemaName, '.MyTable');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
CALL mydriver();
关于mysql - 迭代 MySQL 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13817968/