如何从现有表中删除列?


Answers:



157

通用:

ALTER TABLE table_name DROP COLUMN column_name;

在您的情况下:

ALTER TABLE MEN DROP COLUMN Lname;

72

您的示例很简单,不需要任何其他表格更改,但是通常来讲,这并不是那么简单。

如果其他表引用了此列,那么您需要弄清楚如何处理其他表/列。一种选择是删除外键,并将引用的数据保留在其他表中。

另一种选择是查找所有引用列,并在不再需要它们时也将其删除。

在这种情况下,真正的挑战是找到所有外键。您可以通过查询系统表或使用第三方工具(例如ApexSQL Search(免费)或Red Gate Dependency跟踪器(高级但更多功能))来执行此操作。有外键的整体线程这里


47

这是正确的答案:

ALTER TABLE MEN DROP COLUMN Lname

但是...如果上CONSTRAINT存在a COLUMN,那么您必须DROPCONSTRAINT第一个,然后您就可以DROPCOLUMN。为了删除a CONSTRAINT,运行:

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}

ALTER TABLE tb_name DROP FOREIGN KEY key_name
bortunac

3
HOW-TO搜索constraint
Kiquenet '16

21

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

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

drops仅当exists表中的列在表中时,以上查询才可以重新运行,否则不会引发错误。

无需使用大型IF包装器在放置column之前检查的存在,您只需运行以上DDL语句


3
什么是DIE陈述
Kiquenet '16

3
顺便说一句,您可以将这些类型的“可重新运行”脚本/函数
称为

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 2014年

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

问题不在于添加列。
Kiquenet '16

2

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

  1. 将表放在“设计”视图中(在表上单击鼠标右键),如下所示:

在此处输入图片说明

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

在此处输入图片说明

如前所述,如果还有任何需要删除的关系,它会在此时询问您是否也要删除它们。您可能需要这样做才能删除该列。


0

如果您使用的是C#并且Identity列为int,则创建一个int的新实例而不为其提供任何值。

[identity_column] = new int()


这个答案会做什么?会从表格中删除该列吗?
Prashant Pimpale,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.