Ответ 1
При значительных усилиях да.
SET @db = 'db1';
SET @q = CONCAT('SELECT * FROM ', @db, '.mycol');
PREPARE stmt FROM @q;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Есть ли какой-нибудь способ в MySQL указать имя базы данных в переменную? Например, когда у меня есть база данных под названием "db1", могу ли я сделать что-то вроде этого:
set @db= 'db1';
select * from @db.mytable;
EDIT: есть еще один пример того, что я хочу сделать:
set @dbfrom= 'db1';
set @dbto= 'db2';
insert into @dbto.mytable (col1,col2,col3) select col2,col1,col3 from @dbfrom.mytable;
При значительных усилиях да.
SET @db = 'db1';
SET @q = CONCAT('SELECT * FROM ', @db, '.mycol');
PREPARE stmt FROM @q;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Используя решение Chaos 'Prepare Statement' Мне удалось создать хранимую процедуру, которая использует имя переменной базы данных.
Работает как шарм для переноса данных из одной базы данных в другую с помощью хранимой процедуры. Таким образом, код не привязан к одной базе данных.
DELIMITER $$
DROP PROCEDURE IF EXISTS `SampleProcedure` $$
CREATE PROCEDURE `SampleProcedure`(IN HubDatabaseName VARCHAR(255))
BEGIN
SET @db = HubDatabaseName;
SET @q = CONCAT('
/* Import data from Hub database to local database */
INSERT INTO `table_name_in_local_database`
SELECT
*
FROM
', @db ,'.`tablename`
');
PREPARE stmt FROM @q;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;