我有一列(名为RequestDate
),我需要将其从 更改NULL
为NOT NULL
,但该列上有一个聚集索引,因此我首先需要删除该索引。
最初,索引是使用以下方法创建的:
CREATE CLUSTERED INDEX IX_RequestDate
ON [MyDB].[dbo].[MyTable] (RequestDate);
为了放弃它,我执行了:
Drop Index IX_RequestDate On [MyDB].[dbo].[MyTable]
然后尝试使用以下方法更改列无效性:
ALTER TABLE [MyDB].[dbo].[MyTable] ALTER COLUMN [RequestDate] DATETIME NOT NULL
但出现错误:
对象“MyTable”依赖于列“RequestDate”。
MyTable
然后我使用这个查询列出了 的索引,并且索引仍然存在,尽管现在它没有名称并且它的类型是HEAP
(最初CLUSTERED
):
TableName IndexName IndexType ColumnOrdinal ColumnName ColumnType
MyTable NULL HEAP 0 RequestDate datetime
我有两个问题:
- 为什么删除的索引仍然存在?
- 由于这个仍然存在的索引,我是否得到了上面的依赖错误?
如果是这样,我该如何删除它?
如果没有,还有什么我应该检查的吗?我想避免丢桌子。
请注意,此表没有任何限制。
我正在使用 SQL Server 2014、OS Windows Server 2012 R2,以下是SCRIPT TABLE AS -> CREATE TO
(我更改了一些列名)的输出:
CREATE TABLE [dbo].[MyTable](
[RequestDate] [datetime] NULL,
[UserName] [nvarchar](50) NULL,
[HostName] [nvarchar](20) NULL,
[RequestContent] [ntext] NULL,
[ResponseContent] [ntext] NULL,
[RequestStatus] [int] NULL,
[ErrorMessage] [ntext] NULL,
[Duration] [float] NULL,
[ServiceName] [nvarchar](100) NULL,
[Direction] [int] NULL,
[RequestId] [uniqueidentifier] NOT NULL,
[IsRetry] [bit] NULL,
[CallerId] [nvarchar](100) NULL
)
事实上,索引不再存在,列仍然存在,曾经的聚集索引现在变成了堆。
不,因为索引不再存在。
您可以按照Erik Darling的建议查看表的依赖关系。
正如您在评论中提到的,您使用此方法找到了一个 VIEW,如果您检查CREATE VIEW文档,您将看到选项 SCHEMABINDING 可能导致您提到的错误: