Вставка столбца между другими столбцами в SQL Server с помощью скрипта [дубликат]

этот вопрос уже есть ответ здесь:

Я пытаюсь изменить таблицу в SQL Server с помощью скрипта. В прошлом я всегда делал такие вещи через GUI, но теперь мне нужно создать скрипт, чтобы сделать это для клиенты.

у меня есть таблица базы данных SQL Server, которая выглядит так:

MyTable
-------
ColA int NOT NULL
ColB int NOT NULL
ColC int NOT NULL
ColD VARCHAR(100)

первичный ключ определяется через ColA, ColB и ColC.

Я хочу, чтобы SQL-скрипт изменил таблицу следующим образом:

MyTable
-------
ColA int NOT NULL
ColB int NOT NULL
ColX int NOT NULL  (new column, default 0 for existing data)
ColC int NOT NULL
ColD VARCHAR(100)

первичный ключ теперь будет определяться ColA, ColB, ColX и ColC.

Это легко сделать через графический интерфейс SQL Server. Но когда я создаю сценарий из этого, он кажется излишне сложным. В основном, сценарий создает временную таблицу с новой схемой, копирует все данные, индексы и ограничения из старой таблицы во временную таблицу, удаляет старую таблицу, а затем переименовывает новую в имя старой. Кроме того, он имеет такие строки:

ALTER TABLE dbo.Tmp_MyTable ADD CONSTRAINT
    MyTable21792984_ColC_DF DEFAULT ((0)) FOR ColC

Я обеспокоен тем, что эти случайные числа там (т. е. 21792984) не будут одинаковыми на всех экземплярах базы данных клиентов. Они выглядят как то, что SQL server генерирует при создании базы данных, которая будет уникальный для каждого экземпляра.

есть ли более прямой способ изменения таблицы с помощью команд SQL? Я смотрел онлайн, но то, что я нашел, в основном является основным и/или общим.

обновление: из ответов, которые я получил, похоже, что трудность заключается в том, чтобы поместить новый столбец "между" двумя столбцами. Я понял, что на самом деле не имеет значения, в каком порядке находятся столбцы (если я ошибаюсь, не стесняйтесь оставлять ответ, исправляющий меня). В моем дело в том, что изменение намного проще, если я просто добавлю столбец в конец таблицы, и ничто в коде не полагается на конкретный порядок столбцов.

9 ответов


нет другого способа вставить столбец в таблицу SQL Server "между" существующими столбцами - вам нужно создать временную таблицу и перестроить старую таблицу. Тем не менее, порядок столбцов не должен иметь значения - вы уверены, что столбец должен быть вставлен в порядке?

вероятно, ваш лучший выбор-просто использовать GUI, сценарий, а затем изменить имя ограничения на что-то разумное в сценарии. Вы правы, что имя числового ограничения не идеально, и это не рекомендуется разрешать SQL Server определять имена объектов.


Если вы вставляете поле в середину таблицы, вам по существу нужно удалить текущую таблицу и воссоздать ее, что и делает sql server.

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

чтобы изменить первичный ключ, все вы необходимо выяснить имя ограничения первичного ключа и удалить его. Просто добавьте новое ограничение, определяющее первичный ключ. Это предполагает, что у вас нет первичного ключа, указанного как внешний ключ где-то еще.


Я просто хочу отметить, почему вы никогда не хотите использовать GUI для вставки столбца в середине существующей таблицы. При этом он создает новую таблицу speatare, перемещает данные из старой таблицы, переименовывает старую таблицу, переименовывает новую таблицу в старое имя таблицы и удаляет старую таблицу. Это достаточно плохо, если у вас есть небольшой databaset. В производственном мире, где таблицы могут быть довольно большими, Вы можете блокировать пользователей из доступа к таблице в течение нескольких часов. Любая база данных конструкции, где порядок столбцов в базе данных должен быть изменен при добавлении нового столбца в базе, направился к катастрофе. Потому что есть люди, которые настаивают на этом, хотя это еще одна причина, почему Select * также является проблемой, ожидающей случиться. Вы действительно не хотите, чтобы состояние отображалось в вашем столбце zip в отчете, потому что кто-то переставил столбцы в таблице, и вы полагались на select * из порядка столбцов.


если в вашей CREATE TABLE вы только что указали, скажем,PRIMARY KEY (ColA, ColB, ColC), вы говорили SQL Server, что вас не волнует имя этого ограничения, что вам никогда не придется ссылаться на него напрямую, поэтому SQL Server был полностью оправдан в создании некоторого полуслучайного уникального имени для него, например MyTable21792984_ColC_DF это справедливо беспокоит вас (хотя этот конкретный, кажется,ColC-специфическое ограничение одного столбца, такой же вид именования будет применяться к другим существующие ограничения.)

хотя эта проблема, вероятно, слишком поздно исправить для вашей текущей схемы, это поможет вам в будущем, если вы будете следовать принципу всегда называйте свои ограничения -- как правило, вполне возможно, что вам может потребоваться ссылаться на них в будущем, поэтому вы хотите, чтобы имя было полностью под вашим контролем, как и имя любого другого объекта схемы (таблица, столбец и т. д.). В этом случае, используя условие типа CONSTRAINT PK_MyTable PRIMARY KEY (ColA, ColB, ColC) на CREATE TABLE будет помог. (Если инструменты GUI, которые вы используете для своих задач DBA, не позволяют вам контролировать такие вещи, они не подходят для DBA: найдите лучшие!-).


Не рекомендуется зависеть от какого-либо" естественного "или" неотъемлемого " порядка столбцов в таблице базы данных. Все колонки должны ссылка по имени в любых официально созданных запросах для возврата столбцов по имени в порядке, указанном запросом. Если это правило не выполняется, любые будущие изменения схемы являются абсолютным кошмаром, поскольку системный код может потребоваться изменить каждый раз при обновлении схемы базы данных.

единственная раздражающая вещь здесь было бы при выполнении одноразовых запросов с использованием SELECT * FROM ... в базах данных производства/тестирования/разработки, закодированных вручную пользователями, и ваш новый столбец отображается в конце списка столбцов. Тем не менее, я считаю, что многие инструменты запросов позволят вам изменить порядок столбцов из своего рода GUI.


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


какой инструмент вы используете для создания сценария. Я использую Red-Gate Sql compare tool, и он прекрасно работает.


Если вы хотите, чтобы столбец был посередине, вот что вам нужно сделать. Я нашел скрипт он генерирует, будет достаточно хорошо лишь в том числе работе neceessary.

Если бы вы должны были добавить столбец в конце, например, вам нужно было бы только сделать:

ALTER TABLE ADD COLUMN ColX int NOT NULL DEFAULT(0)

и вы увидите это в сценарий, который он создает.

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


добавьте новый столбец в существующую таблицу.(его добавили в конец всех столбцов ) Затем создайте новую таблицу с помощью этой таблицы и в подзапросе, который используется для создания новой таблицы, укажите столбцы в том порядке, в котором вы хотите их в новой таблице..

Ex:

create table person(name varchar2(10),age number);
alter table person add salary number; (now salary is added at last position)
desc person
 name ...
 age  ...
 salary ... so now salary is at the end.

теперь я хочу создать таблицу employee, используя эту таблицу person.

create table employee as select name,salary,age from person;

когда вы описываете таблицу сотрудников, она имеет определение как таблицы person, а также ДАННЫЕ.