Создание таблиц с динамическими именами с помощью хранимой процедуры - PullRequest
4 голосов
/ 25 октября 2011

Я пытаюсь создать таблицы с динамическими именами. Код, из которого я получаю ошибки, является частью динамического SQL. Я не уверен, в чем проблема. Я новичок в динамическом SQL и хранимых процедурах.

    PREPARE stmt FROM "CREATE TABLE `?` SELECT lat, lon, nfldtime FROM position_reports where mmsi = ? ORDER BY id DESC LIMIT 100";    

    EXECUTE stmt USING CONCAT("mmis", FORMAT(vesselID,0)), vesselID;

Ошибка, возникающая при попытке создать процедуру:

Строка сценария: 4 В вашем синтаксисе SQL есть ошибка; проверить руководство что соответствует вашей версии сервера MySQL для правильного синтаксиса использовать рядом с 'CONCAT ("mmis", FORMAT (vesselID, 0)), vesselID;

Я пробовал это:

EDIT:

от @Konerak, ответьте, теперь это работает:

set @s = CONCAT("CREATE TABLE mmsi", vesselID, " SELECT lat, lon, nfldtime FROM position_reports where mmsi = ", vesselID, " ORDER BY id DESC LIMIT 100");
prepare createTable from @s;
EXECUTE createTable;
DEALLOCATE PREPARE createTable;

1 Ответ

3 голосов
/ 25 октября 2011

Вы не можете заменить имя таблицы на ? в подготовленном операторе , а затем выполнить команду, вставив имя таблицы.

Имена динамических таблиц, как правило, плохая идея : лучше создать 1 большую таблицу и добавить дополнительный (индексированный) столбец для "имени виртуальной таблицы".

Если вам действительно нужны динамические таблицы, вам нужно объединить имя таблицы в самой ПОДГОТОВКЕ .

За и против динамических имен таблиц

Предположим, что вместо помещения всех пользователей в одну таблицу, users со столбцами ID, Name, e-mail, country, ..., вы поместите их в динамические таблицы, users_country, с колонками ID, Name, e-mail, ...

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

  • Вы в любом случае можете физически разделить таблицы, используя PARTITIONS, но ваше логическое представление остается прежним. Любое преимущество, которое, по вашему мнению, вы используете с помощью отдельных таблиц, обычно может быть достигнуто с помощью другого метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...