2010-11-11 5 views
2

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

Спасибо,

S

ответ

2

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

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

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

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

+0

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

+0

Мне нравится, что Филипп хотел бы видеть любые документы, которые у вас есть на этом ... было бы действительно полезно. – scarpacci

+0

Концепции, которые вы используете, это «разделение страниц» и «указатели пересылки». Вот два отличных обсуждения с методами, как их найти на ваших столах, включая эксперименты, чтобы определить, когда они произойдут. http://bit.ly/bIrQvp и http://bit.ly/df3Mp0 Вот ссылка на разрывы страниц, происходящие в результате добавления столбца в существующую таблицу. http://bit.ly/dAxPs0 –

-1
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

Редактировать Это, конечно, правильный ответ на MySQL сервер ... но это не то, что хочет OP.

+2

Вопрос с тегом «sql server» ... –

+2

Это не работает для SqlServer. – GendoIkari

+4

@OMG Ponies, @ Gendolkari Я думал, что mysqld был SQL-сервером. Во всяком случае, сегодня я не могу ничего исправить, поэтому я ухожу в паб. –

9

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

Для более по этому вопросу см:

+1

спасибо OMG Ponies .... вы всегда предоставляете полезную информацию. – scarpacci

+0

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

1

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

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

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

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

Смежные вопросы