T-SQL Добавить столбец в конкретном порядке
Я немного новичок в T-SQL, исходя из фона MySQL. Я все еще приспосабливаюсь к различным нюансам в синтаксисе.
Мне нужно добавить новый столбец ПОСЛЕ конкретного. Я узнал, что AFTER
является допустимым ключевым словом, но я не считаю его правильным для работы.
ALTER TABLE [dbo].[InvStockStatus]
ADD [Abbreviation] [nvarchar](32) DEFAULT '' NOT NULL ;
Это мой текущий запрос, который хорошо работает, за исключением того, что он добавляет поле в конце таблицы, Id предпочитает добавлять его после [Name]
. Какой синтаксис им требуется для представления?
Ответы
Ответ 1
Вы не можете этого сделать
например, если у вас есть таблица, подобная этой
create table TestTable(id1 int,id3 int)
и вы хотите добавить еще один идентификатор столбца id2 между id1 и id3, то вот что делает SQL Server за сценой, если вы используете конструктор
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_TestTable
(
id1 int NULL,
id2 int NULL,
id3 int NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_TestTable SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.TestTable)
EXEC('INSERT INTO dbo.Tmp_TestTable (id1, id3)
SELECT id1, id3 FROM dbo.TestTable WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.TestTable
GO
EXECUTE sp_rename N'dbo.Tmp_TestTable', N'TestTable', 'OBJECT'
GO
COMMIT
Как вы можете видеть, есть ли у вас много данных, это может быть проблематично, почему имеет значение, где находится столбец? просто используйте
select col1,col2,col3 from table
Ответ 2
В то время как с точки зрения функциональной базы данных правильно, что кортежи могут отображаться в любом порядке.
Однако база данных не существует в вакууме. Всегда есть человек, который захочет прочитать схему таблиц (dbas, devs) и проложить вокруг него и поддерживать или записывать запросы против него.
В прошлом я использовал соглашения для столбцов таблицы, таких как упорядочение таблицы с помощью
- первичный ключ сначала
- затем внешние ключи
- затем часто используемые столбцы
- затем другие столбцы
- и, наконец, столбцы, связанные с аудитом
и это помогает при сканировании таблицы. К сожалению, кажется, вам нужно прыгать через обручи, чтобы поддерживать любой порядок, поэтому теперь я должен задать вопрос, стоит ли иметь и поддерживать эти соглашения. Мое новое правило просто добавляет его в конец.
Если вы действительно обеспокоены порядком с точки зрения читаемости, вы должны создать свои собственные "читаемые" представления (возможно, в другой схеме) в любом порядке, который вам нравится. У вас может быть несколько видов одной и той же таблицы (один для основных столбцов и другой, включая материал, который обычно не имеет значения).
Было бы неплохо иметь возможность переупорядочивать столбцы в диаграммах базы данных SQL Server (только для отображения), но это невозможно.
Ответ 3
Последовательность столбцов действительно неуместна в строгом (функциональном) смысле, в любой РСУБД - это просто "тонкость", которую нужно иметь для документации или людей.
SQL Server не поддерживает любые команды T-SQL для упорядочения столбцов. Таким образом, в T-SQL нет синтаксиса для выполнения этого.
Единственный способ изменить это - использовать визуальный конструктор таблиц в SSMS, который действительно воссоздает всю таблицу с нуля, когда вы перемещаете столбцы или вставляете столбцы в середине таблицы.
Ответ 4
Инструменты сравнения схем, которые я видел, создадут новую таблицу с желаемым заказом, а затем скопируют данные из старой таблицы в новую (с некоторой матерью переименования, чтобы новая была похожа на старую). Учитывая то, как этот подход подходит, я полагаю, что нет предложения T-SQL для добавления нового столбца в определенном месте.
Ответ 5
Вы должны всегда добавлять поля только в конце. Вы должны выбрать поля в том порядке, который вы хотите, но никогда не реструктурируете существующую таблицу, чтобы добавить столбец в середине. Это может сломать некоторые вещи (где люди делали такие глупые вещи, как select * или inserts, не указав, что предоставленные столбцы не должны делать эти вещи, но они это делают).
Воссоздание таблицы может быть долговременным процессом без каких бы то ни было преимуществ и может вызвать множество жалоб и блокировок пользователей во время их создания.
Ответ 6
Технически или, может быть, я должен сказать, академически, порядок, в котором столбцы добавляются в таблицу, или порядок, в котором они хранятся в модели внутреннего хранилища базы данных, не должны вас беспокоить. Вы можете просто перечислить столбцы в предложении Select ваших SQL-запросов, чтобы контролировать порядок отображения столбцов или вычисленных выражений в результатах любого выполняемого вами запроса. Внутренне база данных может свободно хранить фактические данные любым способом, который, по его мнению, подходит для оптимизации хранилища, а также помогает выравнивать элементы данных с границами диска и/или памяти.
Ответ 7
Это безопасная работа без использования временной таблицы. После того, как вы добавите столбец в конец, просто перейдите в SQL Sever Management Studio. Нажмите на таблицу, выберите → Дизайн (или Изменить) и перетащите последний столбец туда, где вы хотите,.
Таким образом, вам не нужно беспокоиться о потере данных и индексов. Единственный другой вариант - воссоздать таблицу, которая может быть проблематичной, если у вас большие данные.
Этот ответ предназначен для помощи другим людям и не предназначен для принятия в качестве ответа.
Ответ 8
Прошло много времени с момента публикации этого вопроса, но стоит отметить, что, хотя основной исходный код SQL для размещения столбцов в определенном порядке не изменил процесс генерации скриптов, необходимо позаботиться о том, вы выбираете использовать инструменты данных SQL Server в Visual Studio для управления своей базой данных. База данных, в которую вы развертываете, всегда будет иметь столбцы в том порядке, который вы указываете в своем проекте.