如何从现有表中删除列?
我有一个Fname和Lname的table MEN
我需要删除Lname
怎么做呢?
如何从现有表中删除列?
我有一个Fname和Lname的table MEN
我需要删除Lname
怎么做呢?
当前回答
问题是,你只能从一个不存在的表中删除一个列吗?
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;
删除列有一些先决条件。删除的列不能是:
索引使用 用于检查、外键、唯一或主键约束 与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;
但是要注意的是,在第一个选择和最后一个重命名命令之间有一个插入行的数据丢失窗口。
问题是,你只能从一个不存在的表中删除一个列吗?
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 TABLE_NAME DROP COLUMN COLUMN_NAME;
例如:
alter table Employee drop column address;
如果您正在使用c#,并且Identity列是int,则创建一个int的新实例,而不向它提供任何值。这对我很管用。
[identity_column] = new int()
下面是正确答案:
ALTER TABLE MEN DROP COLUMN Lname
但是…如果列上存在约束,则必须先删除约束,然后才能删除列。为了删除一个约束,运行:
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}