次のTransact-SQLコマンドを実行するとエラーが発生します。
_CREATE UNIQUE NONCLUSTERED INDEX IX_TopicShortName
ON DimMeasureTopic(TopicShortName)
_
エラーは次のとおりです。
メッセージ1505、レベル16、状態1、行1 CREATE UNIQUE INDEXステートメントは、オブジェクト名「dbo.DimMeasureTopic」とインデックス名「IX_TopicShortName」の重複キーが見つかったため終了しました。重複キー値は()です。
_SELECT * FROM sys.indexes WHERE name = 'IX_TopicShortName'
_またはSELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[DimMeasureTopic]')
を実行すると、IX_TopicShortNameインデックスが表示されません。したがって、重複しているようには見えません。
別のデータベースに同じスキーマがあり、問題なくインデックスを作成できます。ここで作成できない理由はありますか?
インデックスがすでに存在するということではなく、テーブル自体にTopicShortName
フィールドの値が重複しているということです。エラーメッセージによると、重複する値は空の文字列です(単なる投稿のファセットかもしれません)。このような重複は、UNIQUE
インデックスの作成を防ぎます。
クエリを実行して、重複があることを確認できます。
SELECT
TopicShortName,
COUNT(*)
FROM
DimMeasureTopic
GROUP BY
TopicShortName
HAVING
COUNT(*) > 1
おそらく他のデータベースではデータが異なり、重複はありません。
重複がデータにあります。このクエリを実行して見つけてください。
SELECT TopicShortName, COUNT(*)
FROM DimMeasureTopic
GROUP BY TopicShortName
HAVING COUNT(*) > 1
これは、テーブル内に一意でないレコードが既にあるためです(その音により、TopicShortNameフィールドの値が空白の2つのレコード)。
そのため、インデックス自体ではなくデータを使用します。
コードベースの移行を使用していて、エンティティのプロパティの名前を変更し、プロパティの一意のインデックスがある場合、エンティティフレームワークは新しい列を作成し、新しい列ではなく新しい列に一意のインデックスを追加しようとしますすべてのヌル値があるため、失敗します。インデックスを作成する行の前に古い列からデータをコピーするには、移行コードを手動で変更する必要があります。
エラーメッセージで重複キー値を指定する必要があります。 「重複キー値は( ''、 ''、 '')ステートメントは終了しました。対処する必要がある重複値があります。