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

Одна вещь, на которую нужно обратить внимание - это разбиение на страницы (я знаю, что это может произойти в SQL Server - возможно, то же самое в MySQL).

Первичные ключи физически упорядочены. Используя целое число с автоматическим добавлением, вы гарантируете, что каждый раз, когда вы вставляете, вы вставляете следующий номер вверх, поэтому нет необходимости переустанавливать ключи для db. Однако, если вы используете строки, вы можете вставить pk в середине других ключей для поддержания порядка pk. Этот процесс переупорядочения pks на вставке может стать дорогим.

372
задан Ryan Gates 9 September 2014 в 17:47
поделиться

11 ответов

ALTER TABLE MEN DROP COLUMN Lname
642
ответ дан Taryn 9 September 2014 в 17:47
поделиться

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

ALTER TABLE MEN DROP COLUMN Lname

Но ... если CONSTRAINT существует на COLUMN, то сначала вы должны DROP CONSTRAINT, тогда вы будете способный DROP к COLUMN. Чтобы сбросить CONSTRAINT, запустите:

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
46
ответ дан Aaron Lelevier 9 September 2014 в 17:47
поделиться

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

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  
7
ответ дан Sir Crispalot 9 September 2014 в 17:47
поделиться

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

[identity_column] = new int ()

0
ответ дан Quofi Ansah 9 September 2014 в 17:47
поделиться

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

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

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

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

72
ответ дан Community 9 September 2014 в 17:47
поделиться

Общий:

ALTER TABLE table_name DROP COLUMN column_name;

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

ALTER TABLE MEN DROP COLUMN Lname;
152
ответ дан nachtigall 9 September 2014 в 17:47
поделиться
  • 1
    привет, викинги, можете ли вы предложить любой другой вариант. – prasad 4 January 2013 в 06:55
  • 2
    привет, викинги, можете ли вы предложить любой другой вариант. – prasad 4 January 2013 в 06:55
  • 3
    привет, викинги, можете ли вы предложить любой другой вариант. – prasad 4 January 2013 в 06:55
  • 4
    привет, викинги, можете ли вы предложить любой другой вариант. – prasad 4 January 2013 в 06:55
  • 5
    привет, викинги, можете ли вы предложить любой другой вариант. – prasad 4 January 2013 в 06:55
  • 6
    привет, викинги, можете ли вы предложить любой другой вариант. – prasad 4 January 2013 в 06:55

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

ALTER TABLE table_name
 ADD
 column_name DATATYPE NULL  

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

ALTER TABLE table_name
DROP COLUMN column_name
2
ответ дан Bart 9 September 2014 в 17:47
поделиться

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;

Например,

изменить таблицу Адрес удаленного столбца сотрудника;

0
ответ дан Anand Pipalwa 9 September 2014 в 17:47
поделиться

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

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

enter image description here

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

enter image description here

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

2
ответ дан Tony L. 9 September 2014 в 17:47
поделиться
  • 1
    Я использовал JavaScript API Карт Google, он только что отображался в веб-представлении, поэтому его не нужно менять в течение достаточно долгого времени. – Vikings 3 October 2012 в 13:59
  • 2
    Я использовал JavaScript API Карт Google, он только что отображался в веб-представлении, поэтому его не нужно менять в течение достаточно долгого времени. – Vikings 3 October 2012 в 13:59
  • 3
    Я использовал JavaScript API Карт Google, он только что отображался в веб-представлении, поэтому его не нужно менять в течение достаточно долгого времени. – Vikings 3 October 2012 в 13:59
  • 4
    Я использовал JavaScript API Карт Google, он только что отображался в веб-представлении, поэтому его не нужно менять в течение достаточно долгого времени. – Vikings 3 October 2012 в 13:59
  • 5
    Я использовал JavaScript API Карт Google, он только что отображался в веб-представлении, поэтому его не нужно менять в течение достаточно долгого времени. – Vikings 3 October 2012 в 13:59
  • 6
    Я использовал JavaScript API Карт Google, он только что отображался в веб-представлении, поэтому его не нужно менять в течение достаточно долгого времени. – Vikings 3 October 2012 в 13:59

Простой ответ на это заключается в следующем:

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;

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

3
ответ дан Martin Brown 9 September 2014 в 17:47
поделиться

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

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

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

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

18
ответ дан Pரதீப் 9 September 2014 в 17:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: