【背景】
工作中涉及到經常要為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