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

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

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

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

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

9 ответов


ALTER TABLE MEN DROP COLUMN Lname

Generic:

ALTER TABLE table_name DROP COLUMN column_name;

в вашем случае:

ALTER TABLE MEN DROP COLUMN Lname;

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

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

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

в таких случаях реальная задача-найти все внешние ключи. Вы можете сделать это, запросив системные таблицы или используя сторонние инструменты, такие как Поиск ApexSQL (бесплатно) или Красные Ворота зависимостей трекер (премиум, но больше возможностей). Там целая нить на внешних ключах здесь


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

ALTER TABLE MEN DROP COLUMN Lname

но... если на COLUMN, необходимо DROP на CONSTRAINT во-первых, тогда вы сможете DROP на COLUMN. Для того, чтобы отбросить CONSTRAINT, run:

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}

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

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

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

вместо использования big 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 table_name
 ADD
 column_name DATATYPE NULL  

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

ALTER TABLE table_name
DROP COLUMN column_name

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

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

enter image description here

  1. Правой Кнопкой Мыши на столбце в режиме конструктора таблицы и нажмите кнопку "Исключать Колонка"

enter image description here

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


простой ответ на это-использовать это:

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, Ограничения внешнего ключа, уникального или первичного ключа
  • связано с значением по умолчанию
  • привязан к правилу

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

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

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;

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