さて、フィルター処理されたインデックスを持つテーブルがあります。テーブルを作成し、いくつかのデータを追加してから、インデックスを追加するスクリプトを次に示します。
CREATE TABLE Supplier (
SupplierId INT NOT NULL,
SupplierLinkId INT NULL,
SupplierName VARCHAR(50));
INSERT INTO Supplier VALUES (1, 2, 'Test Supplier 1');
INSERT INTO Supplier VALUES (2, NULL, 'Test Supplier 2');
INSERT INTO Supplier VALUES (3, NULL, 'Test Supplier 3');
CREATE UNIQUE NONCLUSTERED INDEX uq$Supplier$SupplierLinkId ON Supplier (SupplierLinkId) WHERE SupplierLinkId IS NOT NULL;
次に、たとえばサプライヤ コード用の新しい列をテーブルに追加することにしましたが、保守性の理由から、テーブルの最後には配置したくありません。だから私は使用できません:
ALTER TABLE Supplier ADD SupplierCode VARCHAR(50);
代わりに、テーブル デザイナーに移動し、SupplierLinkId 列を強調表示して右クリックし、列を挿入して詳細を入力します。
- 列名 = SupplierCode;
- データ型 = VARCHAR(50);
- Null を許可 =
[保存] をクリックすると、次のエラーが表示されます。
'Supplier' テーブル - インデックス 'uq$Supplier$SupplierLinkId' を作成できません。
オブジェクト名 'dbo.Supplier' とインデックス名 'uq$Supplier$SupplierLinkId' の重複キーが見つかったため、CREATE UNIQUE INDEX ステートメントは終了しました。重複キー値は () です。ステートメントは終了されました。
しかし、このインデックスはフィルター処理されるはずですが、何らかの理由でフィルターを無視しています。
インデックスを削除しようとすると:
DROP INDEX Supplier.uq$Supplier$SupplierLinkId;
...そして、まだ開いているテーブル デザイナーに戻ると、代わりに次のエラーが表示されます。
テーブル 'Supplier' が変更されました: - インデックス 'uq$Supplier$SupplierLinkId' が削除され、再作成されます。
そのため、デザイナーから離れてから、変更を加えるために戻ってくる必要があります。その後、インデックスを再作成できます (そもそも問題になることはありませんでした)。
しかし、その後、新しい Supplier Code 列を null 非許容にすることにしたので、デザイナーで変更します...そして、インデックスに重複した値があるという同じエラーが発生します。代わりに、このジョブを次のようにスクリプト化しました。
ALTER TABLE Supplier ALTER COLUMN SupplierCode VARCHAR(50) NOT NULL;
テーブルが開いているときにテーブルに変更が加えられた場合、テーブルの設計者がそれを好まない可能性があることは理解できますが、それはまったく理解できます。私が理解していないのは、テーブル デザイナーを使用してテーブルに変更を加えても、フィルター処理されたインデックスの値が重複していないことが明らかな場合に、偽のエラーが発生する理由です。