您的問題可以用準備執行前完全靜態的DDL來解決。示例:
表:
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| a |
| b |
+----------------+
2 rows in set (0.00 sec)
和你(小修改)SQL:
mysql> SET @t = (SELECT GROUP_CONCAT(mytab.TABLE_NAME SEPARATOR ', ') FROM (SELECT * FROM information_schema.TABLES as `m` WHERE table_schema = 'test'
AND table_name LIKE 'a%' LIMIT 0,1) as `mytab`);
Query OK, 0 rows affected (0.06 sec)
mysql> select @t;
+------+
| @t |
+------+
| a |
+------+
1 row in set (0.00 sec)
現在,DDL:
mysql> set @drop = CONCAT('DROP TABLE ', @t);
Query OK, 0 rows affected (0.00 sec)
mysql> select @drop;
+--------------+
| @drop |
+--------------+
| DROP TABLE a |
+--------------+
1 row in set (0.00 sec)
最後,備言:
mysql> PREPARE `stmt1` FROM @drop;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE `stmt1`;
Query OK, 0 rows affected (0.00 sec)
您將獲得:
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| b |
+----------------+
1 row in set (0.00 sec)
只能使用一個變量(我已經添加@drop
,以增加可讀性)
你爲什麼要準備'下降table'但執行'select'? –
在準備好的語句中,不能將任何可能是MySQL標識符的變量數據用作表名。在這種情況下,由於您使用的是從MySQL自己的系統表中查詢的數據,因此完全沒有準備好的語句。 – 2014-01-10 19:32:07
啊謝謝邁克,這是有道理的,因爲其他例子與靜態集合一起工作。 –