2014-01-10 104 views
1

我有一個準備好的語句,我想直接執行到MySQL服務器;編寫語句Mysql

USE `testdb`; 
SET @t = (
    SELECT GROUP_CONCAT(mytab.TABLE_NAME SEPARATOR ', ') 
    FROM (SELECT * FROM information_schema.TABLES as `m` WHERE table_schema = 'testdb' AND table_name LIKE 'mi_%' LIMIT 0,1) as `mytab` 
    ); 
PREPARE `stmt1` FROM 'DROP TABLE t'; 
EXECUTE `stmt1` USING @t; 
DEALLOCATE PREPARE `stmt1`; 

然而,當我執行它的Execute行說

錯誤代碼返回一個錯誤:錯誤1210參數EXECUTE

我將不勝感激任何幫助我做錯了。

我有mysql版本68年1月5日

+0

你爲什麼要準備'下降table'但執行'select'? –

+0

在準備好的語句中,不能將任何可能是MySQL標識符的變量數據用作表名。在這種情況下,由於您使用的是從MySQL自己的系統表中查詢的數據,因此完全沒有準備好的語句。 – 2014-01-10 19:32:07

+0

啊謝謝邁克,這是有道理的,因爲其他例子與靜態集合一起工作。 –

回答

3

您的問題可以用準備執行前完全靜態的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,以增加可讀性)