【问题标题】:How to remove a column from an existing table?如何从现有表中删除列?
【发布时间】:2011-08-03 08:06:02
【问题描述】:

如何从现有表中删除列?

我有一张桌子 MENFnameLname

我需要删除Lname

怎么做?

【问题讨论】:

标签: sql-server


【解决方案1】:
ALTER TABLE MEN DROP COLUMN Lname

【讨论】:

    【解决方案2】:

    通用:

    ALTER TABLE table_name DROP COLUMN column_name;
    

    在你的情况下:

    ALTER TABLE MEN DROP COLUMN Lname;
    

    【讨论】:

      【解决方案3】:

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

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

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

      在这种情况下,真正的挑战是找到所有外键。您可以通过查询系统表或使用第三方工具来做到这一点,例如 ApexSQL Search(免费)或 Red Gate Dependency tracker(高级但更多功能)。外键上有一个完整的线程here

      【讨论】:

        【解决方案4】:

        这是正确答案:

        ALTER TABLE MEN DROP COLUMN Lname
        

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

        ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
        

        【讨论】:

        • ALTER TABLE tb_name DROP FOREIGN KEY key_name
        • HOW-TOconstraint 中搜索
        【解决方案5】:

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

        ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
        

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

        您可以运行上面的DDL 语句,而不是使用大的IF 包装器在删除之前检查column 的存在

        【讨论】:

        • 什么是DIE语句
        • 顺便说一句,你可以调用这些类型的“可重新运行”的脚本/函数Idempotent
        • 这应该是公认的答案。如果你有自动化的 sql 脚本部署,你必须像这样防御性地编写脚本。
        【解决方案6】:

        问题是,你只能从不存在的表中删除一列吗;-)

        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  
        

        【讨论】:

        • 我想如果你想从一个不存在的表中删除一列,这就是这样做的方法
        【解决方案7】:

        这个问题的简单答案是使用这个:

        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 约束使用
        • 与默认值关联
        • 绑定到规则

        如果以上任何一种情况属实,您需要先删除这些关联。

        另外,应该注意的是,删除一列不会从硬盘回收空间,直到重建表的聚集索引。因此,按照上述方法使用如下表重建命令通常是一个好主意:

        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;
        

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

        【讨论】:

          【解决方案8】:

          在现有表中添加列:

          ALTER TABLE table_name
           ADD
           column_name DATATYPE NULL  
          

          删除现有表中的列:

          ALTER TABLE table_name
          DROP COLUMN column_name
          

          【讨论】:

          • 不是关于 ADD 列的问题。
          【解决方案9】:

          这也可以通过 SSMS GUI 完成。这种方法的好处是它会在该列上有任何关系时向您发出警告,并且还可以自动删除这些关系。

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

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

          正如我之前所说,如果有任何关系也需要删除,此时它会询问您是否也想删除这些关系。您可能需要这样做才能删除该列。

          【讨论】:

            【解决方案10】:

            如果您使用 C# 并且 Identity 列是 int,请创建一个新的 int 实例而不提供任何值。它对我有用。

            [identity_column] = new int()

            【讨论】:

            • 这个答案会做什么?它会从表中删除列吗?
            【解决方案11】:

            语法:

            ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
            

            例如:

            alter table Employee drop column address;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-04-17
              • 1970-01-01
              • 2021-12-26
              • 2015-10-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多