首页 文章

如何从现有表中删除列?

提问于
浏览
356

如何从现有表中删除列?

我有一个 MENFnameLname

我需要删除 Lname

怎么做?

10 回答

  • 2

    ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;

    例如

    alter table Employee drop column address;

  • 71
    ALTER TABLE MEN DROP COLUMN Lname
    
  • 0

    通用:

    ALTER TABLE table_name DROP COLUMN column_name;
    

    在你的情况下:

    ALTER TABLE MEN DROP COLUMN Lname;
    
  • 145

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

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

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

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

  • 44

    这是正确的答案:

    ALTER TABLE MEN DROP COLUMN Lname
    

    但是......如果 COLUMN 上存在 CONSTRAINT ,那么你必须先 DROP CONSTRAINT 然后你才能 DROP COLUMN . 要删除 CONSTRAINT ,请运行:

    ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
    
  • 2

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

    ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
    

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

    在放弃它之前使用大 IF 包装器来检查 column 的存在,你可以只运行上面的 DDL 语句

  • 2

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

    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
    
  • 16

    要在现有表中添加列:

    ALTER TABLE table_name
     ADD
     column_name DATATYPE NULL
    

    要删除现有表中的列:

    ALTER TABLE table_name
    DROP COLUMN column_name
    
  • 621

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

    • 将表放在设计视图中(右键单击表),如下所示:

    enter image description here

    • 右键单击表的设计视图中的列,然后单击"Delete Column"

    enter image description here

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

  • 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;
    

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

相关问题