【发布时间】:2011-08-03 08:06:02
【问题描述】:
如何从现有表中删除列?
我有一张桌子 MEN 和 Fname 和 Lname
我需要删除Lname
怎么做?
【问题讨论】:
标签: sql-server
如何从现有表中删除列?
我有一张桌子 MEN 和 Fname 和 Lname
我需要删除Lname
怎么做?
【问题讨论】:
标签: sql-server
ALTER TABLE MEN DROP COLUMN Lname
【讨论】:
通用:
ALTER TABLE table_name DROP COLUMN column_name;
在你的情况下:
ALTER TABLE MEN DROP COLUMN Lname;
【讨论】:
您的示例很简单,不需要任何额外的表更改,但一般来说这不是那么简单。
如果此列被其他表引用,那么您需要弄清楚如何处理其他表/列。一种选择是删除外键并将引用的数据保留在其他表中。
另一种选择是查找所有引用列,如果不再需要它们,也将它们删除。
在这种情况下,真正的挑战是找到所有外键。您可以通过查询系统表或使用第三方工具来做到这一点,例如 ApexSQL Search(免费)或 Red Gate Dependency tracker(高级但更多功能)。外键上有一个完整的线程here
【讨论】:
这是正确答案:
ALTER TABLE MEN DROP COLUMN Lname
但是...如果COLUMN上存在CONSTRAINT,那么你必须先DROPCONSTRAINT,然后你才能DROPCOLUMN。为了删除CONSTRAINT,运行:
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
【讨论】:
constraint 中搜索列?
在 SQL Server 2016 中,您可以使用新的 DIE 语句。
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
只有当它在表中exists 时,上面的查询才能重新运行drops 列,否则它不会抛出错误。
您可以运行上面的DDL 语句,而不是使用大的IF 包装器在删除之前检查column 的存在
【讨论】:
问题是,你只能从不存在的表中删除一列吗;-)
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
【讨论】:
这个问题的简单答案是使用这个:
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;
删除列有一些先决条件。删除的列不能是:
如果以上任何一种情况属实,您需要先删除这些关联。
另外,应该注意的是,删除一列不会从硬盘回收空间,直到重建表的聚集索引。因此,按照上述方法使用如下表重建命令通常是一个好主意:
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;
但请注意,在第一个选择和最后一个重命名命令之间存在插入行的数据丢失窗口。
【讨论】:
在现有表中添加列:
ALTER TABLE table_name
ADD
column_name DATATYPE NULL
删除现有表中的列:
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;
【讨论】: