#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. Может ли третья часть программного обеспечения указывать на представление? Если нет, бросьте полотенце и спросите, что они спрашивают — иногда нам приходится соглашаться с тем, что «нам это нужно для совместимости с другим приложением, которое мы не можем изменить (прямо сейчас)» — динамическое подготовленное заявление должно работать.