Як видалити стовпець із наявної таблиці?
У мене стіл MEN
з Fname
іLname
Мені потрібно зняти Lname
Як це зробити?
Як видалити стовпець із наявної таблиці?
У мене стіл MEN
з Fname
іLname
Мені потрібно зняти Lname
Як це зробити?
Відповіді:
ALTER TABLE MEN DROP COLUMN Lname
Ваш приклад простий і не потребує додаткових змін таблиці, але, загалом, це не так банально.
Якщо на цей стовпець посилаються інші таблиці, то вам потрібно розібратися, що робити з іншими таблицями / стовпцями. Один із варіантів - видалити сторонні ключі та зберігати посилання на дані в інших таблицях.
Інший варіант - знайти всі посилаються стовпці та видалити їх, якщо вони більше не потрібні.
У таких випадках справжньою проблемою є пошук усіх сторонніх ключів. Це можна зробити за допомогою запитів системних таблиць або використовуючи сторонні інструменти, такі як ApexSQL Search (безкоштовно) або відстежувач залежності Red Gate (додаткові, але інші функції). Там цілий потік на зовнішні ключі тут
Це правильна відповідь:
ALTER TABLE MEN DROP COLUMN Lname
Але ... якщо CONSTRAINT
існує на COLUMN
, то ви повинні першим, то ви зможете . Для того, щоб скинути a , запустіть: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;
Але будьте попереджені, тут є вікно для втрати даних вставлених рядків між першим вибором та останньою командою перейменування.
Це також можна зробити через GUI SSMS. Приємна річ у цьому методі - він попереджає вас про наявність будь-яких зв’язків у цьому стовпці, а також може автоматично видалити їх.
Як я вже говорив раніше, якщо є якісь стосунки, які також потрібно буде видалити, в цей момент він запитає вас, чи бажаєте ви їх також видалити. Вам, ймовірно, доведеться це зробити, щоб видалити стовпець.
Якщо ви використовуєте C #, а стовпець Identity - це int, створіть новий екземпляр int, не надаючи йому жодного значення. Він працював на мене.
[ident_column] = new int ()
Синтаксис:
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
Наприклад:
alter table Employee drop column address;