Как удалить столбец из существующей таблицы?
У меня есть таблица MEN
с Fname
и Lname
Мне нужно удалить Lname
Как это сделать?
Как удалить столбец из существующей таблицы?
У меня есть таблица MEN
с Fname
и Lname
Мне нужно удалить Lname
Как это сделать?
ALTER TABLE MEN DROP COLUMN Lname
Generic:
ALTER TABLE table_name DROP COLUMN column_name;
В вашем случае:
ALTER TABLE MEN DROP COLUMN Lname;
Ваш пример прост и не требует каких-либо дополнительных изменений таблицы, но, вообще говоря, это не так просто.
Если этот столбец ссылается на другие таблицы, вам нужно выяснить, что делать с другими таблицами/столбцами. Один из вариантов - удалить внешние ключи и сохранить ссылки на данные в других таблицах.
Другой вариант - найти все ссылочные столбцы и удалить их, если они больше не нужны.
В таких случаях реальной проблемой является поиск всех внешних ключей. Вы можете сделать это, запросив системные таблицы или использовать сторонние инструменты, такие как ApexSQL Search (бесплатно) или Red Gate Dependency tracker (премиальные, но дополнительные функции). Там целый поток на внешние ключи здесь
Это правильный ответ:
ALTER TABLE MEN DROP COLUMN Lname
Но... если a CONSTRAINT
существует на COLUMN
, тогда вы должны DROP
CONSTRAINT
, тогда вы сможете DROP
COLUMN
. Чтобы удалить a CONSTRAINT
, запустите:
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
В 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;
Но будьте осторожны, есть окно для потери данных вставленных строк здесь между первой командой select и последней командой rename.
Чтобы добавить столбцы в существующую таблицу:
ALTER TABLE table_name
ADD
column_name DATATYPE NULL
Чтобы удалить столбцы в существующей таблице:
ALTER TABLE table_name
DROP COLUMN column_name
Это также можно сделать с помощью графического интерфейса SSMS. Самое приятное в этом методе - это предупреждение о том, есть ли какие-либо отношения в этом столбце и также может автоматически их удалить.
Как я уже говорил, если есть какие-либо отношения, которые также необходимо будет удалить, он попросит вас в этот момент, если вы также захотите их удалить. Вам, вероятно, потребуется сделать это, чтобы удалить столбец.
Синтаксис:
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
Например:
alter table Employee drop column address;
Если вы используете С# и столбец Identity имеет тип int, создайте новый экземпляр int, не предоставляя ему никакого значения. Это сработало для меня.
[identity_column] = new int()