SQL Server Добавить столбец - PullRequest
2 голосов
/ 11 ноября 2010

Я хочу добавить столбец в одну из моих таблиц в SQL Server. Я не хочу, чтобы это было в конце списка столбцов в таблице ... Я на самом деле хочу, чтобы это было где-то еще (мудрое местоположение) в таблице. Есть ли другой вариант, кроме удаления и восстановления (заполнения) таблицы для достижения этой цели? Я, очевидно, не хочу потерять какие-либо свои данные, но я бы предпочел, чтобы в конце определения таблицы не было столбца.

Спасибо

S

Ответы [ 4 ]

9 голосов
/ 11 ноября 2010

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

Подробнее об этом см .:

2 голосов
/ 11 ноября 2010

Краткий ответ: Я согласен с OMG Ponies, порядок столбцов не важен.Если у вас нет кластеризованного индекса, просто удалите и заново создайте таблицу, а не запустите ALTER TABLE x ADD col .

Длинный ответ: Если в вашей таблице естьДостаточно много данных (на ум приходит 50 МБ), тогда вам лучше будет воссоздать таблицу, а не ALTER TABLE x ADD col План размещения страниц данных для таблицы рассчитывается во время создания таблицы, поэтому приПри добавлении столбца SQL Server обычно помещает данные нового столбца на отдельных страницах и выдвигает указатели с существующих страниц данных на новые страницы данных для добавленного столбца.Если вы собираетесь широко использовать новый столбец, то IO таблицы будет очень плохим, поскольку чтение даже 1 строки потребует чтения как минимум 2 страниц.Сканирование таблиц также будет работать плохо, так как всегда будут выполняться прямые указатели, в результате чего при чтении таблицы, которые обычно последовательно перемещаются назад и вперед на вашем диске во время чтения.

В этом случае лучше переименовать существующую таблицу,воссоздайте свою таблицу с новым столбцом, вставьте в table_name выберите col1, col2, 'null или default для нового col', col3 из temp_renamed_table и, наконец, удалите старую таблицу, которую вы переименовали.Страницы данных будут намного лучше организованы, и ваш ввод-вывод будет быстрее, несмотря на то, что с точки зрения разработчика SQL он выглядит одинаково, чем при использовании ALTER TABLE .Если у вас есть кластеризованный индекс, таблица будет реорганизована, когда вы добавите столбец, и расщепление страниц будет менее вероятным.Вы также можете запустить ALTER TABLE x REBUILD , если у вас есть SQL Server 2008, у вас нет кластерного индекса и много времени, когда пользователи не используют вашу таблицу.Трудно комментировать вашу стратегию индексирования, не зная гораздо большего.

Это гораздо лучшая причина для воссоздания таблицы, чем что-то вроде косметического порядка столбцов.

1 голос
/ 11 ноября 2010

Перестановка столбцов в таблице - крайне плохая практика. Даже не пытайтесь делать такие вещи. Порядок столбцов не имеет значения, если вы использовали правильные методы кодирования (например, никогда и я имею в виду никогда), используя select *.

Если вы использовали select * и изменили порядок столбцов, вы еще больше рискуете испортить код, потому что запрос может ожидать не Цена в качестве третьего столбца, а в качестве второго столбца, что может серьезно испортить много вещей.

Кроме того, единственный способ сделать это - создать другую таблицу, переместить данные, а затем отбросить старую таблицу и переименовать первую. Конечно, если у вас есть ФК, их тоже нужно отбросить и воссоздать. Это занимает много времени, если у вас большой набор данных, и может вызвать проблемы у пользователей.

Нет такого обстоятельства, при котором вы могли бы подумать сделать это для стола, который находится на производстве, поскольку он слишком рискованный. Если вы находитесь на ранних стадиях проектирования, вы можете подумать об этом.

0 голосов
/ 11 ноября 2010
ALTER TABLE my_table ADD COLUMN column_name VARCHAR(50) AFTER col_name;

замена значения VARCHAR (50)

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

Edit Edit, конечно, правильный ответ для сервера MySQL... но это не то, что хочет ОП.

...