MySQL Функция для возврата имени таблицы для использования в запросе - PullRequest
0 голосов
/ 28 августа 2009

Можно ли использовать функцию или процедуру MySQL для возврата имен таблиц, которые можно использовать в запросе?

Что-то вроде

SELECT * FROM get_db_table_name(2342352412);

где get_db_table_name() - это определенная пользователем функция, которая принимает user_id в качестве параметра и возвращает таблицу db.table, где находится этот пользователь. Я не смог сделать это таким образом, потому что MySQL жалуется на синтаксис (я думаю, это потому, что мне пришлось определить тип возвращаемого значения для функции, который я попытался использовать как VARCHAR(30), и это неправильно или невозможно). Так возможно ли это?

История в том, что у меня есть несколько баз данных, которые по сути являются осколками. Назовем их user_1, user_2 и т. Д.

У меня также есть одна таблица, скажем emails, которая содержит записи с user_id s из таблиц user_1.users, user_2.users и т. Д.

Поскольку я знаю способ вычисления таблицы, из которой происходит идентификатор, просто взглянув на идентификатор, я просто хочу, чтобы функция принимала входные данные и возвращала имя db.table для использования.

Спасибо!

P.S. Я хотел бы использовать вышеупомянутый запрос SELECT в качестве определения VIEW, которое принесло бы имя пользователя из соответствующей базы данных / таблицы, выполнив JOIN через соответствующую таблицу.

Ответы [ 3 ]

2 голосов
/ 28 августа 2009

Для этого вы можете использовать подготовленные заявления , например ::100100

....
SET @tbl = 'nameofmytable';
SET @sql = CONCAT( 'SELECT * FROM ', @tbl );
EXECUTE @sql;
...
0 голосов
/ 12 февраля 2010

Параметризация имени таблицы обычно считается из-за неправильного проектирования базы данных . Неужели невозможно объединить все объекты одного типа (в данном случае, ваших пользователей) в одну таблицу?

0 голосов
/ 28 августа 2009

При определении представления необходимо указать таблицы . Вы не можете определить представление «ВЫБРАТЬ ОТ, где необходимо» ...

Определение представления «заморожено» во время создания, поэтому последующие изменения в базовых таблицах не влияют на определение представления. Например, если представление определено как SELECT * для таблицы, новые столбцы, добавленные в таблицу позже, не становятся частью представления.

Вы должны указать мой взгляд на эту, эту и эту таблицу. Глядя на это, вы не можете выполнить SELECT * FROM func (id), потому что вы не можете указать, какими будут результаты этой функции (в зависимости от входного параметра).

Синтаксис SELECT:

SELECT * FROM table_references

Единственный способ "динамического" SELECT - это динамический SQL, на что @Zed ответил ...

Извините, если мой ответ неполон, но я не знаю вашей проблемы в деталях. Удачи!

...