mysql生產批量處理數據 比如批量truncate ..


【背景】

     工作中涉及到經常要為QA同學批量清空表記錄,這里記錄一下我的操作過程和遇到的問題,最后做一下小結。

 

【過程】

     ①.拼SQL

     這個很簡單,用“CONCAT”從“information_schema”里面獲取“TABLE_NAME”拼成要執行的一句句SQL。

SELECT CONCAT("TRUNCATE TABLE `", t.TABLE_NAME, '`;') FROM information_schema.`TABLES` t
WHERE t.TABLE_NAME NOT IN(
    ……
    )
AND t.TABLE_NAME NOT LIKE "……"
AND t.TABLE_NAME REGEXP "……"
AND t.TABLE_SCHEMA = "……";

     ②.關閉外鍵檢查

SET FOREIGN_KEY_CHECKS = 0;

     ③.執行過程①拼出來的SQL

     ④.打開外鍵檢查

SET FOREIGN_KEY_CHECKS = 1;

 

【小結】

     ①“CONCAT” and “information_schema”

     以前批量寫SQL要么在Notepad里面手動批量寫一下,要么去Excel里面用公式拼一下,而現在基本上都是用“CONCAT”,是一個強大的(批量)寫SQL的SQL語句。“CONCAT”與MySQL的系統庫“information_schema”結合,數據庫操作簡直6的飛起。

     ②“DELETE” or “TRUNCATE”

     “DELETE”和“TRUNCATE”都是用來清空表數據,但一般情況下我都是用“TRUNCATE”。關於“TRUNCATE”的詳細介紹參見我的另一篇博文http://blog.csdn.NET/sweeper_freedoman/article/details/52553427。這篇文章自己翻譯了MySQL5.6官方文檔關於“TRUNCATE”語句的部分。本來還想翻譯“DELETE”語句部分,但是該部分太長了而且我英語不咋滴。但有一點,二者最大的區別就是“TRUNCATE”是DDL而“DELETE”是DML,它們之間的其他區別都是因此產生的。

     ③開關外鍵檢查

     為了保證數據的完整性和一致性,表之間的外鍵關聯很有作用,但是在執行DML時,外鍵關聯經常會掣肘。在批量刪的過程中先關閉檢查可以防止報錯。參考上面關於“TRUNCATE”詳細介紹的鏈接內容,有外鍵關系的InnoDB父子表須改用“DELETE”進行操作。

     ④反單引號' ` '的使用

[SQL] 
TRUNCATE TABLE question_1.0;
[Err] 1146 - Table 'question_1.0' doesn't exist

     看看這個報錯,從“information_schema”里面查詢到的“TABLE_NAME”怎么可能不存在,唯一的可能性就是表名在SQL中被隔斷了,這就涉及到MySQL分隔符反單引號“ `”的使用了。其實從操作系統層面、到數據庫、再到編程語言,都有反單引號“ ` ”這家伙的烙印。關於它的詳細介紹參見我的另一篇博文http://blog.csdn.Net/sweeper_freedoman/article/details/52550743

文章轉載於http://blog.csdn.net/sweeper_freedoman/article/details/51137181


免責聲明!

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



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