【问题标题】:MySQL change database with variable valueMySQL更改具有可变值的数据库
【发布时间】:2012-03-29 08:32:36
【问题描述】:

我正在设置一个变量,然后我想使用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 时想要 ":=" 而不是 "="
  • 如果我使用 := 或只使用 = 也是一样的,这意味着 USE 仍然会尝试评估字符串 @con
  • 是的。刚刚发现:“您还可以在 SET 以外的语句中为用户变量赋值。在这种情况下,赋值运算符必须是 := 而不是 =,因为后者在非 SET 语句中被视为比较运算符 = :“。抱歉,我帮不上忙。
  • 感谢您的尝试。希望以前有人遇到过这个问题。
  • USE 接受一个标识符。它与字符串文字一起使用是一个未记录的怪癖,并不意味着它将采用变量(或者实际上是任何表达式)。简而言之,它就是不能那样工作。

标签: mysql database deployment connection


【解决方案1】:

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

@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 参数甚至可以传递给脚本。这样我就可以动态构建 create 语句。

【讨论】:

    【解决方案2】:

    我认为USE @var; 以某种方式是不可能的。但在某些情况下,反之亦然。

    USE testDB;
    SET @schema = DATABASE();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      相关资源
      最近更新 更多