如何从现有表中删除列?
如何从现有表中删除列?
我有一个Fname
用Fname
和Lname
我需要删除Lname
怎么做?
ALTER TABLE MEN DROP COLUMN Lname
通用:
ALTER TABLE table_name DROP COLUMN column_name;
在你的情况下:
ALTER TABLE MEN DROP COLUMN Lname;
你的例子很简单,不需要任何额外的表更改,但一般来说这并不是那么简单。
如果这个列被其他表引用,那么你需要弄清楚如何处理其他表/列。 一种select是删除外键,并将引用的数据保存在其他表中。
另一个select是find所有的引用列,并删除它们,如果不再需要它们。
在这种情况下,真正的挑战是find所有的外键。 您可以通过查询系统表或使用第三方工具(如ApexSQL Search (免费)或Red Gate Dependency跟踪器 (高级但更多function))来执行此操作。 这里有一个完整的外键
这是正确的答案:
ALTER TABLE MEN DROP COLUMN Lname
但是,如果在COLUMN
上存在一个CONSTRAINT
,那么你必须首先DROP
CONSTRAINT
,然后才能DROP
COLUMN
。 为了删除CONSTRAINT
,请运行:
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
在SQL Server 2016中,您可以使用新的DIE语句。
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
上面的查询是可重新运行的,只有当它exists
于表中的情况下才会drops
列,否则它不会抛出错误。
在删除之前,不要使用大的IF
包装来检查column
的存在,而只需运行上面的DDL
语句
问题是,你是否只能删除一个未来的表中的列;-)
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
这也可以通过SSMS GUI完成。 关于这个方法的好处是它会警告你,如果这个列上有任何关系,也可以自动删除这些关系。
- 在devise视图中放置表格(右键单击表格),如下所示:
- 右键单击表格“devise”视图中的列,然后单击“删除列”
正如我之前所说的,如果有什么关系还需要删除,那么现在就会问你是否也想删除这些关系。 您可能需要这样做才能删除该列。
在现有表格中添加列:
ALTER TABLE table_name ADD column_name DATATYPE NULL
删除现有表中的列:
ALTER TABLE table_name DROP COLUMN column_name