2016-12-18 2 views
0

У меня есть и старая база данных MySQL, где мне нужно вставлять новые столбцы в таблицы (для поддержки новых частей интерфейса). Но некоторые из старых частей используют команды SQL, которые зависят от количества столбцов и порядка вместо их имен. например:Какие команды MySQL могут использовать порядок столбцов вместо имен

INSERT INTO `data` VALUES (null /*auto-id*/, "name", "description", ...) 

При добавлении новых столбцов в эту таблицу, я получаю the error:

1136 - Количество столбцов не совпадает с количеством значений в строке 1

Сейчас я узнать о INSERT, который необходимо изменить на:

INSERT INTO `data` (`name`, `desc`, ...) VALUES ("name", "description", ...) 

Вопрос: есть ли другие команды, которые могут использовать аналогичный синтаксис, который зависит от порядка или количества столбцов вместо их имен? Мне нужно обновить все старые команды SQL до обновления БД и использовать метод trial & error будет очень длинным.

SELECT не являются проблемой, поскольку интерфейс использует ассоциативное отображение и правильно использует их имена везде, поэтому новые столбцы будут просто игнорироваться. Также я уверен, что нет команд, которые изменяют структуру БД (например, ALTER TABLE).

+0

Не отвечающий на ваш вопрос, но дополнительные столбцы могут непреднамеренно влиять на запросы, используя NATURAL JOIN. –

+0

Или запросы с использованием профсоюзов. – Shadow

+0

Или существующие операторы SELECT, которые используют неквалифицированные ссылки столбцов, добавление столбцов может вызвать появление новых ошибок «неоднозначного столбца». – spencer7593

ответ

1

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

Вставьте, вы уже знаете.

Обновление требует, чтобы каждое обновленное поле указывалось, поэтому в основном это нормально. Однако подзапросы могут использоваться в предложении where, а mysql разрешает многосетевые обновления, поэтому мои точки вокруг выбора применяются.

Удалить применяется к целой записи, поэтому нет ничего, что повлияло бы на дополнительное поле. Тем не менее, подзапросы могут использоваться в предложении where, поэтому мои точки вокруг select действительно применяются.

Вы попытались исключить выбор, но не должны. Это не только конечный набор результатов, которые могут оказать влияние на новое поле:

  1. подзапрос может использовать select *, что и дополнительное поле может привести к ошибке во внешнем запросе. Например, недавно введенное поле может иметь то же имя, что и другое поле во внешнем запросе, что приводит к ошибке неоднозначного имени поля.

  2. Если select * используется в союзе, то количество столбцов может не совпадать после добавления нового поля.

  3. Натуральные соединения также могут быть затронуты введением нового поля.