0

次のようないくつかの列でフィルター処理された非クラスター化を作成したテーブルがあります。

CREATE UNIQUE NONCLUSTERED INDEX [IX_Sh_Esh] ON [dbo].[My_Tbl] 
(
    [City_Code] ASC,
[Sh_Esh] ASC
)
WHERE ([Sh_Bod]=(0) AND [Noe_Fa]=(0))
WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF,            IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    GO

と:

CREATE UNIQUE NONCLUSTERED INDEX [IX_Kho] ON [dbo].[My_Tbl] 
(
[City_Code] ASC,
[Kho] ASC
)
WHERE ([Sh_Bod]=(0) AND [Sh_Esh]=(0) AND [Noe_Fa]=(1))
WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF,     IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

エラーなしでテーブルにこのインデックスを作成しますが、新しい列を追加しようとすると、次のエラーが発生します。

'My_Tbl' table
- Unable to create index 'IX_Sh_Esh'.  
The CREATE UNIQUE INDEX statement terminated because a duplicate key was found for the object name 'My_Tbl' and the index name 'IX_Sh_Esh'. The duplicate key value is (3, 0).

ステートメントは終了されました。

私のテーブルデータは次のとおりです。

ここに画像の説明を入力

最初のインデックスによると、行 No. 1 と No. 4 は where 節を満たしていないため、行にインデックスを作成しないでください。なぜ上記のエラーが発生するのですか?

ありがとう

編集1)

興味深い点があります。そのインデックスを削除して列を追加すると、そのインデックスを再作成すると、インデックスはエラーなしで作成されます.STRANGE!!!!

4

1 に答える 1

1

インデックスを削除してからデータを追加してからインデックスを再作成できる理由は、インデックスを作成しても既存のデータがチェックされず、挿入/更新しようとしているデータだけがチェックされるためです。

フィルター処理されたインデックスであるため、エラーは発生しません。一意のインデックスであり、一意のインデックスが存在するテーブルの列に重複する値を追加しようとしているためにエラーが発生しています。それが彼らの美しさです!重複データが必要な場合は、インデックスを一意にしないでください。

于 2011-08-13T00:18:19.037 に答える