How to remove a column from an existing table?
如何从现有表中删除列?
我有一个表
我需要删除
怎么做?
1 | ALTER TABLE MEN DROP COLUMN Lname |
通用:
1 | ALTER TABLE table_name DROP COLUMN column_name; |
在你的情况下:
1 | ALTER TABLE MEN DROP COLUMN Lname; |
您的示例很简单,不需要任何其他表更改,但一般来说这不是那么简单。
如果此列被其他表引用,那么您需要弄清楚如何处理其他表/列。一种选择是删除外键并在其他表中保留引用的数据。
另一种选择是查找所有引用列,如果不再需要它们也将其删除。
在这种情况下,真正的挑战是找到所有外键。您可以通过查询系统表或使用第三方工具(如ApexSQL搜索(免费)或Red Gate依赖关系跟踪器(高级但更多功能)来执行此操作。外键上有一个完整的线程
这是正确的答案:
1 | ALTER TABLE MEN DROP COLUMN Lname |
但是......如果
1 | ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname} |
在SQL Server 2016中,您可以使用新的DIE语句。
1 | ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name |
只有在表中
在放弃之前使用大
问题是,你能否只从一张未发表的表中删除一列;-)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 | ALTER TABLE MEN DROP COLUMN Lname; |
可以像这样指定多个列:
1 | ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol; |
从SQL Server 2016开始,也可以仅删除列(如果存在)。这可以阻止您为可能不关心的事情收到错误。
1 | ALTER TABLE MEN DROP COLUMN IF EXISTS Lname; |
删除列有一些先决条件。删除的列不能是:
- 由索引使用
- 由CHECK,FOREIGN KEY,UNIQUE或PRIMARY KEY约束使用
- 与DEFAULT相关联
- 绑定规则
如果以上任何一种情况属实,您需要先删除这些关联。
此外,应该注意的是,在重建表的聚簇索引之前,删除列不会从硬盘中回收空间。因此,通常使用如下的表重建命令来执行上述操作通常是个好主意:
1 | ALTER TABLE MEN REBUILD; |
最后,有些人说这可能很慢,可能会在一段时间内锁定表格。可以创建具有所需结构的新表,然后重命名为:
1 2 3 4 5 6 7 8 9 10 11 12 | 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; |
但请注意,在第一个选择命令和最后一个重命名命令之间有一个数据丢失插入行的窗口。
这也可以通过SSMS GUI完成。这个方法的好处是它会警告你,如果该列上有任何关系,也可以自动删除它们。
柱"
正如我之前所说,如果有任何关系也需要删除,它会在此时询问您是否也要删除这些关系。您可能需要这样做才能删除该列。
要在现有表中添加列:
1 2 3 | ALTER TABLE table_name ADD column_name DATATYPE NULL |
要删除现有表中的列:
1 2 | ALTER TABLE table_name DROP COLUMN column_name |
如果你正在使用C#并且Identity列是int,那么创建一个int的新实例而不向它提供任何值。它对我有用。
[identity_column] = new int()
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
例如
alter table Employee drop column address;