Создание таблиц с динамическими именами с помощью хранимой процедуры

#mysql #stored-procedures #dynamic

#mysql #хранимые процедуры #динамический

Вопрос:

Я пытаюсь создать таблицы с динамическими именами. Код, из которого я получаю ошибки, является частью динамического 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;

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

Редактировать:

от @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:

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

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

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

Плюсы и минусы динамических имен таблиц

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

  • Вы не можете легко запросить все таблицы. Допустим, вы хотите знать, сколько ваших пользователей мужского пола — вам нужно запросить каждую таблицу и ОБЪЕДИНИТЬ результаты. Быстрее не будет.
  • Вы все равно можете физически разделить таблицы с помощью РАЗДЕЛОВ, но ваше логическое представление останется прежним. Любое преимущество, которое, по вашему мнению, у вас есть при использовании отдельных таблиц, обычно может быть достигнуто с помощью другого метода.

Комментарии:

1. Я бы предпочел не иметь таблиц с динамическими именами, однако меня заставляют. Возможно, вы можете уточнить, почему это плохая идея

2. О, иногда есть преимущества наличия нескольких таблиц с одинаковыми данными, но разделенными. Но эти случаи редки и часто делаются по неправильным причинам. Позвольте мне отредактировать сообщение.

3. Почему вас заставляют? Какие причины они изобретают? Почему таблицы с дополнительным индексированным столбцом недостаточно? Вы всегда можете создавать представления в таблице, если вам нужен ограниченный доступ для определенных пользователей.

4. потому что третья часть программного обеспечения должна быть направлена на реальную таблицу.. не спрашивай меня почему, потому что я не знаю.

5. Может ли третья часть программного обеспечения указывать на представление? Если нет, бросьте полотенце и спросите, что они спрашивают — иногда нам приходится соглашаться с тем, что «нам это нужно для совместимости с другим приложением, которое мы не можем изменить (прямо сейчас)» — динамическое подготовленное заявление должно работать.