如何从现有表中删除列?

Gal*_*ali 376 sql-server

如何从现有表中删除列?

我有一个表MENFnameLname

我需要删除 Lname

怎么做?

jco*_*ctx 649

ALTER TABLE MEN DROP COLUMN Lname
Run Code Online (Sandbox Code Playgroud)


reg*_*gie 155

通用:

ALTER TABLE table_name DROP COLUMN column_name;
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

ALTER TABLE MEN DROP COLUMN Lname;
Run Code Online (Sandbox Code Playgroud)


小智 72

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

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

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

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


Aar*_*ier 47

这是正确的答案:

ALTER TABLE MEN DROP COLUMN Lname
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
Run Code Online (Sandbox Code Playgroud)

  • _HOW-TO_搜索"约束"为**列**? (3认同)

Pரத*_*ீப் 21

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

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
Run Code Online (Sandbox Code Playgroud)

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

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

  • 什么是 ***DIE 语句***? (4认同)
  • 这应该是公认的答案.如果你有自动sql脚本部署,你必须像这样防御性地编写你的脚本. (4认同)
  • 顺便说一句,您可以调用这些类型的"可重新运行"脚本/函数[Idempotent](https://en.wikipedia.org/wiki/Idempotence) (3认同)
  • 如果存在则丢弃? (2认同)

小智 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  
Run Code Online (Sandbox Code Playgroud)


Mar*_*own 5

一个简单的答案就是使用这个:

ALTER TABLE MEN DROP COLUMN Lname;
Run Code Online (Sandbox Code Playgroud)

可以这样指定多个列:

ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;
Run Code Online (Sandbox Code Playgroud)

从SQL Server 2016中,也可以仅删除该列(如果存在)。当该列不存在时,这会阻止您收到错误消息,而这可能是您不关心的。

ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;
Run Code Online (Sandbox Code Playgroud)

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

  • 由索引使用
  • 由CHECK,FOREIGN KEY,UNIQUE或PRIMARY KEY约束使用
  • 与DEFAULT关联
  • 一定要遵守

如果以上任何一项为真,则需要先删除那些关联。

另外,应该注意的是,在重建表的聚集索引之前,删除列不会从硬盘上回收空间。因此,通常遵循以下这样的表重建命令是一个好主意:

ALTER TABLE MEN REBUILD;
Run Code Online (Sandbox Code Playgroud)

最后,正如某些人所说的那样,这可能很慢,并且可能会在持续时间内锁定表。可以创建具有所需结构的新表,然后像这样重命名:

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;
Run Code Online (Sandbox Code Playgroud)

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