Sql-Server
為什麼刪除的索引仍然存在,它會阻止表被更改嗎?
我有一列(名為
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 可能導致您提到的錯誤:
SCHEMABINDING
將視圖綁定到基礎表的架構。指定 SCHEMABINDING 時,不能以會影響視圖定義的方式修改一個或多個基表。必須首先修改或刪除視圖定義本身,以刪除對要修改的表的依賴關係。$$ … $$