Mysql中表名作為參數的問題


近期由於程序的異常,導致數據庫中創建了大量的表(約4000個),糾結的是表中的數據還都是有用的。

需要合並到一個表中,首先想到的就是使用存儲過程來處理,但由於表名都是動態生成的,需要解決在存儲過程中處理以表名作為參數的問題。

1、用set或者declare語句將表名定義為變量,在sql中的表名位置使用變量,經驗證行不通,數據庫會把變量名當作表名。

2、要進行的操作直接用concat拼接出來,然后直接執行這個sql。可如何在存儲過程中執行拼接的sql,經查找可使用PREPARE 來完成。

下面是示例代碼:

將表test_1~test_100中的數據都插入到test表中。

a. 數據插入使用了insert into ... select ..from ... on duplicate key update xxx=$$; (“無則插入,有則更新”)

b. 對表test_x進行操作之前,斷定了表是否存在。在MySQL中庫的相關系統都存放在庫information_schema中,與表相關的信息存放  在表TABLES中。

 1 BEGIN
 2         DECLARE total INT DEFAULT 100;
 3 
 4         WHILE total >0 DO
 5             # 先判斷表test_x是否存在
 6             SELECT count(TABLE_NAME) INTO @tbCount FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test' AND TABLE_NAME=CONCAT('test_',total); 
 7             IF @tbCount >0 THEN
 8                 SET @InsertData = CONCAT('insert into test (id,name) select t2.id,t2.name from test_',total,' t2 on duplicate key update name=t2.name');
 9                 PREPARE stmt FROM @InsertData;  
10                 EXECUTE stmt; 
11                 SET @dropTable = CONCAT('DROP TABLE test_',total,';');
12                 PREPARE stmt1 FROM @dropTable;  
13                 EXECUTE stmt1; 
14             END IF;
15 
16             SET total = total-1;
17 
18         END WHILE;
19 
20 END;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM