deezus blog

.Net Core、Typescriptを中心に技術的ノウハウを公開しています

インデックスに含まれるカラムのALTER

既存テーブルのカラムの型やサイズの変更を行う場合、下記ALTER文で行います

SQL Server

ALTER TABLE [table_name] ALTER COLUMN [column_name] VARCHAR(100)

PostgreSQL

ALTER TABLE "table_name" ALTER COLUMN "column_name" VARCHAR(100)

MySQL

ALTER TABLE `table_name` MODIFY `column_name` VARCHAR(100)

いずれも型をVARCHAR(100)に変更しています
特に問題は起きませんが、変更しようとするカラムがインデックスに含まれており、かつサイズを小さくする場合、SQL Serverではエラーが発生します
(PostgreSQLMySQLではインデックスに含まれていても正常に変更できます)

インデックス 'index_name' は 列 'column_name' に依存しています。
ALTER TABLE ALTER COLUMN column_name は失敗しました。1 つ以上のオブジェクトがこの 列 を参照しています。

この場合、あらかじめインデックスを削除し、再度インデックスを作成する必要があります

BEGIN TRANSACTION
DROP INDEX [index_name] ON [table_name]
ALTER TABLE [table_name] ALTER COLUMN [column_name] VARCHAR(100) 
CREATE NONCLUSTERED INDEX [index_name] ON [table_name]([column_name])
COMMIT TRANSACTION