【问题标题】:Can i drop a column of a table in SQL server which is having a non clustered index defined on it我可以删除 SQL Server 中定义了非聚集索引的表的列吗
【发布时间】:2015-06-18 11:31:46
【问题描述】:

我有一张记录数巨大的桌子。一些列上定义了非聚集索引。

我们需要更改/删除一些定义了此类索引的列。

我已直接更改/删除了列,但 没有收到任何错误,例如:

Alter statement failed 。它成功了。所以,这是我的问题:

是否需要在将要删除/更改的列上删除非聚集索引?

why it did give any errors similar to case of constraints/keys defined on them ?

更新:

What incase of alteting a column for its size ? Is it supposed to throw any error ?

【问题讨论】:

  • 我很困惑......你没有在你的问题中回答你的问题吗? “我直接删除了列,没有出现任何错误”-“我可以删除列吗?”
  • “我已经直接删除了列,没有收到任何错误”是否意味着您发出了 SQL 命令(例如,ALTER TABLE yyy DROP xxx),或者您使用了图形界面(右键单击表并选择Design) 来执行此操作?

标签: sql-server alter non-clustered-index


【解决方案1】:

你的问题的措辞对我来说有点奇怪,我无法完全理解你的问题......但这很容易测试你自己。

您不能删除具有索引的列,请参阅:

CREATE TABLE tempThing (id int IDENTITY(1,1) PRIMARY key, someValue varchar(50))
GO
CREATE INDEX idxTemp ON dbo.tempThing (someValue)
GO

然后:

ALTER TABLE dbo.tempThing DROP COLUMN someValue

给出错误:

消息 5074,第 16 级,状态 1,第 1 行 索引“idxTemp”取决于列“someValue”。 消息 4922,第 16 级,状态 9,第 1 行 ALTER TABLE DROP COLUMN someValue 失败,因为一个或多个对象访问此列。

【讨论】:

  • 可能是个愚蠢的问题:聚集索引呢?
  • 聚集索引也是如此。此外,聚簇索引通常位于您的主键列上,因此您将有额外的约束来引发错误。
  • 是的,我同意你的看法。我没有删除定义了索引的列,只是改变了它们的大小(增加)。在这种情况下,它没有抛出任何错误。对吗?
  • 只要您只是增加列大小而不更改其类型或减小大小,就不会出现问题。
【解决方案2】:

我刚试过这个:

create table #t1(i1 int, i2 int)
create index a1 on #t1(i1)


alter table #t1 drop column i1

失败 与消息 alter table drop column i1 failed because one or more objects access this`列。

你确定你有引用那些被删除列的索引并且它们被成功删除了吗?

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 2019-03-22
    • 2019-07-05
    • 2012-10-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多