Sql-Server

將導致刪除索引的數據庫事件

  • August 17, 2014

在 SQL Server 中,如果我們嘗試更改具有索引的列的數據類型,那麼它會刪除與該列關聯的索引並更改數據類型。我沒有意識到這一點,並且面臨刪除索引的問題,所以我想知道是否有任何數據庫更改事件(SQL 命令)會導致刪除索引。

這取決於您用於更改列的方法。我們將從一個簡單的表格開始:

CREATE TABLE dbo.Customers (ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, CustomerName NVARCHAR(200));
CREATE INDEX IX_CustomerName ON dbo.Customers(CustomerName);

然後使用 SQL Server 管理表設計器將 CustomerName 列更改為 VARCHAR(200) 而不是 NVARCHAR。預設情況下,當您嘗試保存更改(甚至只是生成更改腳本)時,您會收到警告:

SQL Server Management Studio 警告

您可以通過點擊工具、選項、設計器、表和數據庫設計器來覆蓋 SSMS 中的警告,然後取消選中“防止保存需要重新創建表的更改”框。

這很危險,因為如果您在生產環境中更改表,最終可能會在 SQL Server 從頭開始重建表時鎖定它。我真的很喜歡微軟預設啟用此選項。

禁用它並再次嘗試編輯後,不要保存表 - 相反,點擊表設計器,生成更改腳本。您收到有關數據失去的新警告,因為您正在縮小數據類型,從 Unicode 友好數據類型 (NVARCHAR) 向下移動到非 Unicode 數據類型 (VARCHAR)。如果我們忽略該錯誤,我們可以看到更改腳本。它包括創建新表、將數據移入其中,最後重新創建所有非聚集索引:

SSMS 重新創建非聚集索引

如果您使用不同的數據庫設計器工具,或者如果您使用不同的數據類型更改,您可以獲得不同的結果。例如,如果您將欄位從 VARCHAR(MAX) 更改為 INT,您將失去 VARCHAR(MAX) 欄位的全文索引,因為您無法對數字進行全文索引。

引用自:https://dba.stackexchange.com/questions/73905