使用变量值更改MySQL数据库

7

我正在设置一个变量,然后想使用 USE 命令来更改数据库。不幸的是,USE 不会评估该变量。

SET @con="testDB";
Query OK, 0 rows affected (0.00 sec)
select @con;
+--------+
| @con   |
+--------+
| testDB |
+--------+
1 row in set (0.00 sec)
use @con;
ERROR 1049 (42000): Unknown database '@con'

所以当我尝试连接时,变量的值不会被评估。有什么想法吗?

当使用SET时,我认为你想要使用":="而不是"="。 - keyser
如果我使用 := 或者只是 =,效果是一样的,这意味着 USE 仍然会尝试计算字符串 @con。 - bioShark
是的。我刚发现这个:“您还可以在除SET之外的语句中为用户变量分配值。在这种情况下,赋值运算符必须是:=而不是=,因为后者在非SET语句中被视为比较运算符=。”很抱歉我不能提供更多帮助。 - keyser
谢谢您的尝试。希望有人之前遇到过这个问题。 - bioShark
1
USE 命令需要一个标识符。虽然它可以使用字符串字面量,但这是一个未记录的怪异行为,并不意味着它可以接受变量(或者任何表达式)。简而言之,它就是不能那样工作。 - outis
你是对的。然而,我找到了一个解决方法。如果有人感兴趣,我已经回答了自己的问题。 - bioShark
2个回答

10

我已经找到了自己的解决方案,所以我要回答自己的问题,以防有人感兴趣。

@outis 你是正确的,使用变量与命令USE是不可能的。

然而,由于我想在运行时指定数据库创建表格,我的解决方案是使用动态SQL:

set @schema="testDB";
set @front="CREATE TABLE IF NOT EXISTS ";
set @endpart=".`TEST1` (DIM_ID INT(16)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_unicode_ci;";
set @stat=concat(@front,@schema,@endpart);
prepare command from @stat;
execute command;

基本上,这个解决方案会建立一个语句,准备好并执行它。 @schema 参数甚至可以传递给脚本。这样我就可以动态地构建创建语句。


0

我认为无法以某种方式使用USE @var;。但在某些情况下,采用另一种方法可能是一个选择。

USE testDB;
SET @schema = DATABASE();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接