如何从现有表中删除列?

如何从现有表中删除列?

我有一个表MENFnameLname

我需要删除Lname

怎么做呢?

632732 次浏览

泛型:

ALTER TABLE table_name DROP COLUMN column_name;

在你的情况下:

ALTER TABLE MEN DROP COLUMN Lname;
ALTER TABLE MEN DROP COLUMN Lname

在现有表中添加列:

ALTER TABLE table_name
ADD
column_name DATATYPE NULL

删除现有表中的列。

ALTER TABLE table_name
DROP COLUMN column_name

您的示例很简单,不需要任何额外的表更改,但一般来说,这并不是微不足道的。

如果此列被其他表引用,则需要确定如何处理其他表/列。一种选择是删除外键,并在其他表中保留引用数据。

另一种选择是找到所有引用列,如果不再需要,也将它们删除。

在这种情况下,真正的挑战是找到所有外键。你可以通过查询系统表或使用第三方工具,如ApexSQL搜索(免费)或Red Gate 依赖追踪(高级但更多功能)来做到这一点。有一个关于外键在这里的整个线程

问题是,你只能从一个不存在的表中删除一个列吗?

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

但是…如果CONSTRAINT存在于COLUMN上,那么你必须先DROP CONSTRAINT,然后才能DROP COLUMN。为了删除CONSTRAINT,运行:

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}

这也可以通过SSMS GUI来完成。这个方法的好处是它会警告你是否该列上有任何关系,也可以自动删除这些关系。

  1. 将表格放入设计视图(右键单击表格),如下所示:

enter image description here

  1. 在表的设计视图中右键单击列,然后单击“删除” 李列”< / >

enter image description here

如前所述,如果有任何关系也需要删除,此时它将询问您是否也想删除这些关系。您可能需要这样做来删除列。

SQL Server 2016中,你可以使用新的DIE语句。

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

上面的查询是可重新运行的,它drops列,只有当它在表中exists,否则它不会抛出错误。

而不是使用大的IF包装器来检查column是否存在,然后再删除它,你可以只运行上面的DDL语句

这个问题的简单答案是:

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;

删除列有一些先决条件。删除的列不能是:

  • 索引使用
  • 用于检查、外键、唯一或主键约束
  • 与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;

但是要注意的是,在第一个选择和最后一个重命名命令之间有一个插入行的数据丢失窗口。

语法:

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;

例如:

alter table Employee drop column address;

如果您正在使用c#,并且Identity列是int,则创建一个int的新实例,而不向它提供任何值。这对我很管用。

[identity_column] = new int()