Как удалить столбец из существующей таблицы?


386

Как удалить столбец из существующей таблицы?

У меня есть таблица MENс FnameиLname

Мне нужно удалить Lname

Как это сделать?


12
возможный дубликат удаления столбцов в MS SQL Server 2005
rene

Ответы:



157

Общий:

ALTER TABLE table_name DROP COLUMN column_name;

В твоем случае:

ALTER TABLE MEN DROP COLUMN Lname;

72

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

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

Другой вариант - найти все ссылающиеся столбцы и удалить их, если они больше не нужны.

В таких случаях реальной проблемой является поиск всех внешних ключей. Вы можете сделать это, запросив системные таблицы или используя сторонние инструменты, такие как ApexSQL Search (бесплатно) или Red Gate Dependency tracker (премиум, но больше функций). Там целая тема по внешним ключам здесь


47

Это правильный ответ:

ALTER TABLE MEN DROP COLUMN Lname

Но ... если CONSTRAINTсуществует на COLUMN, то вы должны первым, то вы сможете . Чтобы бросить , запустите:DROPCONSTRAINTDROPCOLUMNCONSTRAINT

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}

ALTER TABLE tb_name DROP ИНОСТРАННЫЙ КЛЮЧ ключ_имя
bortunac

3
HOW-TO поиск constraintпо колонке ?
Kiquenet

21

В SQL Server 2016 вы можете использовать новые операторы DIE.

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

Вышеуказанный запрос повторно запускается в этом dropsстолбце, только если онexists в таблице, иначе он не выдаст ошибку.

Вместо того, чтобы использовать большие IFобертки, чтобы проверить существование columnперед тем, как отбросить его, вы можете просто выполнить приведенный выше DDLоператор


3
Какие заявления DIE ?
Kiquenet

3
Кстати, вы можете называть эти типы «перезапускаемых» скриптов / функций идемпотентными
tomosius

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

7

Вопрос в том, можно ли удалить только столбец из несуществующей таблицы ;-)

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  

1
Я полагаю, если вы хотите удалить столбец из несуществующей таблицы, это был бы способ сделать это
Matiaan

6

Простой ответ на это заключается в использовании этого:

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;

Есть некоторые предпосылки для удаления столбцов. Удаляемые столбцы не могут быть:

  • Используется индексом
  • Используется ограничениями CHECK, FOREIGN KEY, UNIQUE или PRIMARY KEY
  • Связанный с DEFAULT
  • Привязан к правилу

Если что-то из перечисленного верно, вам нужно сначала удалить эти ассоциации.

Кроме того, следует отметить, что удаление столбца не освобождает пространство от жесткого диска до тех пор, пока кластерный индекс таблицы не будет перестроен. Поэтому часто рекомендуется следовать приведенному выше с помощью команды перестроения таблицы, например:

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;

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


2

Чтобы добавить столбцы в существующую таблицу:

ALTER TABLE table_name
 ADD
 column_name DATATYPE NULL  

Чтобы удалить столбцы в существующей таблице:

ALTER TABLE table_name
DROP COLUMN column_name

Вопрос не о колонках ADD .
Kiquenet

2

Это также можно сделать через графический интерфейс SSMS. Хорошая особенность этого метода в том, что он предупреждает вас о наличии каких-либо связей в этом столбце, а также может автоматически их удалять.

  1. Поместите таблицу в режиме конструктора (щелкните правой кнопкой мыши по таблице) следующим образом:

введите описание изображения здесь

  1. Щелкните правой кнопкой мыши столбец в представлении «Дизайн» таблицы и выберите «Удалить столбец».

введите описание изображения здесь

Как я уже говорил ранее, если есть какие-либо отношения, которые также необходимо удалить, на данном этапе вас спросят, хотите ли вы удалить их. Скорее всего, вам придется сделать это, чтобы удалить столбец.


0

Если вы используете C # и столбец Identity имеет тип int, создайте новый экземпляр int, не предоставляя ему никакого значения. Это сработало для меня.

[identity_column] = new int ()


Что этот ответ будет делать? Будет ли это удалить столбец из таблицы?
Prashant Pimpale

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.