Sql-Server
更改 nvarchar 列的大小時,是否需要刪除唯一索引?重新創建索引時表會被鎖定嗎?
在我們的數據庫中存在一個或多或少看起來像這樣的大表:
CREATE TABLE dbo.production_data ( pd_id BIGINT PRIMARY KEY, serial NVARCHAR(16) NOT NULL UNIQUE, ... );
但現在串列欄位的大小已經變小了,所以我想將其更改為 32。Visual Studio 架構比較工具建議通過以下方式執行此操作:
DROP INDEX ux_production_data_serial ON dbo.production_data; GO ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL; GO CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC);
這真的需要嗎?或者更像是一種超級省錢的方式?
另外在重新創建唯一索引時,我的表會被鎖定嗎?因為這將是一個大問題(因為表有 3000 萬行,我猜重新創建索引需要相當長的時間),因為下一個維護視窗是未來幾個月。我的替代方案是什麼?
無需刪除並重新創建索引。
只需使用
ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL;
這只是元數據更改。
將列從 更改
NVARCHAR(16)
為NVARCHAR(32)
根本不會影響儲存。反過來(從
NVARCHAR(32)
toNVARCHAR(16)
)會給你一個關於對象依賴於列的錯誤,所以也許 Visual Studio 總是生成那個樣板程式碼來代替檢查它是否真的需要。