如何从现有表中删除列?
我有MEN
和Fname
Lname
我需要删除Lname
怎么做?
答案 0 :(得分:639)
ALTER TABLE MEN DROP COLUMN Lname
答案 1 :(得分:150)
通用:
ALTER TABLE table_name DROP COLUMN column_name;
在你的情况下:
ALTER TABLE MEN DROP COLUMN Lname;
答案 2 :(得分:72)
您的示例很简单,不需要任何其他表格更改,但一般来说这不是那么简单。
如果此列被其他表引用,那么您需要弄清楚如何处理其他表/列。一种选择是删除外键并在其他表中保留引用的数据。
另一种选择是查找所有引用列,如果不再需要它们也将其删除。
在这种情况下,真正的挑战是找到所有外键。您可以通过查询系统表或使用第三方工具(例如ApexSQL Search(免费)或红门Dependency tracker(高级但更多功能)来执行此操作。外键上有一个完整的主题here
答案 3 :(得分:45)
这是正确答案:
ALTER TABLE MEN DROP COLUMN Lname
但是......如果CONSTRAINT
上存在COLUMN
,那么您必须先DROP
CONSTRAINT
,然后才能DROP
COLUMN
。要删除CONSTRAINT
,请运行:
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
答案 4 :(得分:18)
在 SQL Server 2016 中,您可以使用新的DIE语句。
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
只有在表中drops
的情况下,上述查询才会重新运行exists
列,否则它不会抛出错误。
除了使用大IF
包装器在删除它之前检查column
的存在,您可以运行上面的DDL
语句
答案 5 :(得分: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
答案 6 :(得分:3)
对此的简单回答是使用:
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;
但是请注意,在第一个选择命令和最后一个重命名命令之间有一个数据丢失插入行的窗口。
答案 7 :(得分:2)
在现有表格中添加列:
ALTER TABLE table_name
ADD
column_name DATATYPE NULL
删除现有表格中的列:
ALTER TABLE table_name
DROP COLUMN column_name
答案 8 :(得分:2)
这也可以通过SSMS GUI完成。关于这个方法的好处是它会警告你,如果该列上有任何关系,也可以自动删除它们。
答案 9 :(得分:0)
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
例如
变更表员工放置列地址;
答案 10 :(得分:0)
如果您使用的是C#并且Identity列为int,请创建一个int的新实例而不为其提供任何值。
[identity_column] = new int()