如何从现有表中删除列?
我有一个表MEN
与Fname
和Lname
我需要删除 Lname
怎么做?
如何从现有表中删除列?
我有一个表MEN
与Fname
和Lname
我需要删除 Lname
怎么做?
Answers:
ALTER TABLE MEN DROP COLUMN Lname
您的示例很简单,不需要任何其他表格更改,但是通常来讲,这并不是那么简单。
如果其他表引用了此列,那么您需要弄清楚如何处理其他表/列。一种选择是删除外键,并将引用的数据保留在其他表中。
另一种选择是查找所有引用列,并在不再需要它们时也将其删除。
在这种情况下,真正的挑战是找到所有外键。您可以通过查询系统表或使用第三方工具(例如ApexSQL Search(免费)或Red Gate Dependency跟踪器(高级但更多功能))来执行此操作。有外键的整体线程这里
这是正确的答案:
ALTER TABLE MEN DROP COLUMN Lname
但是...如果上CONSTRAINT
存在a COLUMN
,那么您必须DROP
是CONSTRAINT
第一个,然后您就可以DROP
了COLUMN
。为了删除a 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
drops
仅当exists
表中的列在表中时,以上查询才可以重新运行,否则不会引发错误。
无需使用大型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
一个简单的答案就是使用这个:
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;