Як видалити стовпець із наявної таблиці?


Відповіді:



157

Загальне:

ALTER TABLE table_name DROP COLUMN column_name;

У вашому випадку:

ALTER TABLE MEN DROP COLUMN Lname;

72

Ваш приклад простий і не потребує додаткових змін таблиці, але, загалом, це не так банально.

Якщо на цей стовпець посилаються інші таблиці, то вам потрібно розібратися, що робити з іншими таблицями / стовпцями. Один із варіантів - видалити сторонні ключі та зберігати посилання на дані в інших таблицях.

Інший варіант - знайти всі посилаються стовпці та видалити їх, якщо вони більше не потрібні.

У таких випадках справжньою проблемою є пошук усіх сторонніх ключів. Це можна зробити за допомогою запитів системних таблиць або використовуючи сторонні інструменти, такі як ApexSQL Search (безкоштовно) або відстежувач залежності Red Gate (додаткові, але інші функції). Там цілий потік на зовнішні ключі тут


47

Це правильна відповідь:

ALTER TABLE MEN DROP COLUMN Lname

Але ... якщо CONSTRAINTіснує на COLUMN, то ви повинні першим, то ви зможете . Для того, щоб скинути a , запустіть:DROPCONSTRAINTDROPCOLUMNCONSTRAINT

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}

АЛЬТЕР ТАБЛИЦА tb_name КОРОТКА ЗОВНІШНЯ КЛЮЧА key_name
bortunac

3
HOW-TO пошук constraintпо колонці ?
Кікенет

21

У SQL Server 2016 ви можете використовувати нові оператори DIE.

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

Вищенаведений запит повторно виконує його dropsстовпець, лише якщо він existsв таблиці ще не призведе до помилки.

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


3
Що таке заяви DIE ?
Кікенет

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 .
Кікенет

2

Це також можна зробити через GUI SSMS. Приємна річ у цьому методі - він попереджає вас про наявність будь-яких зв’язків у цьому стовпці, а також може автоматично видалити їх.

  1. Помістіть таблицю у вигляд дизайну (клацніть правою кнопкою миші на таблиці) так:

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

  1. Клацніть правою кнопкою миші на стовпчик у поданні дизайну таблиці та натисніть «Видалити стовпчик»

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

Як я вже говорив раніше, якщо є якісь стосунки, які також потрібно буде видалити, в цей момент він запитає вас, чи бажаєте ви їх також видалити. Вам, ймовірно, доведеться це зробити, щоб видалити стовпець.


0

Якщо ви використовуєте C #, а стовпець Identity - це int, створіть новий екземпляр int, не надаючи йому жодного значення. Він працював на мене.

[ident_column] = new int ()


Що ця відповідь зробить? Чи видалить стовпчик із таблиці?
Прашант Пімпале

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.