Как удалить столбец из существующей таблицы?
У меня есть таблица MEN
с Fname
иLname
Мне нужно удалить Lname
Как это сделать?
Как удалить столбец из существующей таблицы?
У меня есть таблица MEN
с Fname
иLname
Мне нужно удалить Lname
Как это сделать?
Ответы:
ALTER TABLE MEN DROP COLUMN Lname
Ваш пример прост и не требует каких-либо дополнительных изменений таблицы, но, вообще говоря, это не так тривиально.
Если на этот столбец ссылаются другие таблицы, вам нужно выяснить, что делать с другими таблицами / столбцами. Один из вариантов - удалить внешние ключи и сохранить данные в других таблицах.
Другой вариант - найти все ссылающиеся столбцы и удалить их, если они больше не нужны.
В таких случаях реальной проблемой является поиск всех внешних ключей. Вы можете сделать это, запросив системные таблицы или используя сторонние инструменты, такие как ApexSQL Search (бесплатно) или Red Gate Dependency tracker (премиум, но больше функций). Там целая тема по внешним ключам здесь
Это правильный ответ:
ALTER TABLE MEN DROP COLUMN Lname
Но ... если CONSTRAINT
существует на COLUMN
, то вы должны первым, то вы сможете . Чтобы бросить , запустите:DROP
CONSTRAINT
DROP
COLUMN
CONSTRAINT
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
constraint
по колонке ?
В SQL Server 2016 вы можете использовать новые операторы DIE.
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
Вышеуказанный запрос повторно запускается в этом drops
столбце, только если онexists
в таблице, иначе он не выдаст ошибку.
Вместо того, чтобы использовать большие IF
обертки, чтобы проверить существование column
перед тем, как отбросить его, вы можете просто выполнить приведенный выше DDL
оператор
Вопрос в том, можно ли удалить только столбец из несуществующей таблицы ;-)
BEGIN TRANSACTION
IF exists (SELECT * FROM sys.columns c
INNER JOIN sys.objects t ON (c.[object_id] = t.[object_id])
WHERE t.[object_id] = OBJECT_ID(N'[dbo].[MyTable]')
AND c.[name] = 'ColumnName')
BEGIN TRY
ALTER TABLE [dbo].[MyTable] DROP COLUMN ColumnName
END TRY
BEGIN CATCH
print 'FAILED!'
END CATCH
ELSE
BEGIN
SELECT ERROR_NUMBER() AS ErrorNumber;
print 'NO TABLE OR COLUMN FOUND !'
END
COMMIT
Простой ответ на это заключается в использовании этого:
ALTER TABLE MEN DROP COLUMN Lname;
Можно указать более одного столбца следующим образом:
ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;
В SQL Server 2016 также возможно удалить столбец, только если он существует. Это останавливает вас, когда вы не можете получить сообщение об ошибке, а это, вероятно, вас не волнует.
ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;
Есть некоторые предпосылки для удаления столбцов. Удаляемые столбцы не могут быть:
Если что-то из перечисленного верно, вам нужно сначала удалить эти ассоциации.
Кроме того, следует отметить, что удаление столбца не освобождает пространство от жесткого диска до тех пор, пока кластерный индекс таблицы не будет перестроен. Поэтому часто рекомендуется следовать приведенному выше с помощью команды перестроения таблицы, например:
ALTER TABLE MEN REBUILD;
Наконец, как некоторые говорили, это может быть медленным и, вероятно, заблокирует таблицу на время. Можно создать новую таблицу с желаемой структурой, а затем переименовать так:
SELECT
Fname
-- Note LName the column not wanted is not selected
INTO
new_MEN
FROM
MEN;
EXEC sp_rename 'MEN', 'old_MEN';
EXEC sp_rename 'new_MEN', 'MEN';
DROP TABLE old_MEN;
Но имейте в виду, что здесь есть окно для потери данных вставленных строк между первым выбором и последней командой переименования.
Это также можно сделать через графический интерфейс SSMS. Хорошая особенность этого метода в том, что он предупреждает вас о наличии каких-либо связей в этом столбце, а также может автоматически их удалять.
Как я уже говорил ранее, если есть какие-либо отношения, которые также необходимо удалить, на данном этапе вас спросят, хотите ли вы удалить их. Скорее всего, вам придется сделать это, чтобы удалить столбец.
Если вы используете C # и столбец Identity имеет тип int, создайте новый экземпляр int, не предоставляя ему никакого значения. Это сработало для меня.
[identity_column] = new int ()
Синтаксис:
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
Например:
alter table Employee drop column address;