2013-12-18 3 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 ОСНОВНОЙ \t ВСЕ \t ... ОСНОВНОЙ домен \t \t \t eq_ref ОСНОВНОЙ \t ... \t DERIVED by_domainid_and_day \t Использование временного, используя FileSort '(Я надеюсь, что эта таблица будет доступна для чтения) – velop

+0

Это самый простой способ получить все строки под столбцом таблицы, чтобы увидеть, какие таблицы используются. и номера столбцов строк для подсчета записей, полученных из каждой таблицы. EXPLAIN в основном используется для оптимизации запросов, но он соответствует вашим потребностям в этом случае. –

+0

Когда у меня есть запрос, который запрашивает таблицы из нескольких баз данных, база данных не включена в имя таблицы. как и выше by_domainid_and_day, поступает из stats-db, где я в настоящее время находится в tmp-db. Вы знаете, как обойти эту ошибку. – velop

0

Я думаю, это зависит от того, как у вас есть. Если это что-то вроде (Select * from X join Y on 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

Смежные вопросы