2013-12-18 23 views
0

Hy,我有一個任意的SQL查詢。從這個查詢開始,我想知道這個查詢將訪問或更改哪些表。可能會定義一些函數或觸發器,這些函數或觸發器會另外改變查詢中聲明的其他表以外的其他表。找出哪些表將要通過mysql查詢訪問(事先)

我想創建一個不同的mysql服務器,我發送查詢。但是,這些表格需要事先創建,但是哪些?

任何想法?

+0

這不是什麼[交易](http://en.wikipedia.org/wiki/Database_transaction)是爲了什麼?由於函數和觸發器無法解析查詢,因此您可以執行事務,找出哪些表受到影響,如果不想提交,請執行「ROLLBACK」。 – user555

+0

如果它確實是一個任意的查詢,那麼你需要一個sql解析器。看看ANTLR? –

+0

會這樣的幫助:https://code.google.com/p/php-sql-parser/ –

回答

2

您可以運行查詢的EXPLAIN,它顯示了計劃和所有將要使用的表。所以它會是:

EXPLAIN yourqueryhere 
+0

這看起來非常有前途好像我必須做一些解析有作爲,對派生表,因爲我得到的東西是這樣的:。 'ID \t SELECT_TYPE \t表\t型\t ... \t PRIMARY \t \t ALL ... \t PRIMARY域\t \t eq_ref PRIMARY \t ... \t DERIVED by_domainid_and_day \t使用臨時;使用文件排序'(我希望這張表能夠被讀取) – velop

+0

這是最簡單的方法,您可以獲取表列下的所有行,以查看正在使用哪些表。併爲從每個表中檢索的記錄計數行列數。 EXPLAIN主要用於查詢優化,但在這種情況下它適合您的需要 –

+0

當我有一個查詢請求來自多個數據庫的表時,數據庫不包含在表名中。像上面by_domainid_and_day來自stats-db,我目前在tmp-db。你知道如何規避這個缺陷。 – velop

0

我想這取決於你是如何擁有它。如果是這樣的話(選擇* from X join blah blah)你可以解析數據並檢索表名。

$string = "select * from table_name join table_name_2 on table_name_2.id = table_name.table_name_2_id join table_name_3 blah blah"; 
preg_match_all('/(?<=from|join|update)\S+/i', $string, $match); 
print_r($match); 
+0

您需要過濾掉子查詢,例如'從(選擇...' – Barmar