Как удалить столбец из существующей таблицы?
Как удалить столбец из существующей таблицы?
у меня есть таблица MEN
с Fname
и Lname
мне нужно удалить Lname
как это сделать?
9 ответов
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. Хорошая вещь об этом методе предупреждает вас, если есть какие-либо отношения в этом столбце, а также может автоматически удалить их.
- поместите таблицу в проектный вид (щелкните правой кнопкой мыши по таблице) так:
- Правой Кнопкой Мыши на столбце в режиме конструктора таблицы и нажмите кнопку "Исключать Колонка"
Как я уже говорил ранее, если есть какие-либо отношения, которые также необходимо удалить, он спросит вас на данный момент, если вы хотите удалить их, а также. Вероятно, вам нужно будет сделать это, чтобы удалить столбец.
простой ответ на это-использовать это:
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.