54

次の Transact-SQL コマンドを実行するとエラーが発生します。

CREATE UNIQUE NONCLUSTERED INDEX IX_TopicShortName
ON DimMeasureTopic(TopicShortName)

エラーは次のとおりです。

メッセージ 1505、レベル 16、状態 1、行 1 オブジェクト名 'dbo.DimMeasureTopic' とインデックス名 'IX_TopicShortName' の重複キーが見つかったため、CREATE UNIQUE INDEX ステートメントは終了しました。重複キー値は () です。

を実行すると、SELECT * FROM sys.indexes WHERE name = 'IX_TopicShortName'またはSELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[DimMeasureTopic]')IX_TopicShortName インデックスが表示されません。したがって、重複はないようです。

別のデータベースに同じスキーマがあり、問題なくインデックスを作成できます。ここで作成しない理由はありますか?

4

5 に答える 5

106

インデックスが既に存在しているわけではありませんがTopicShortName、テーブル自体にフィールドの値が重複しています。エラーメッセージによると、重複する値は空の文字列です(投稿の側面に過ぎない可能性があります)。このような重複は、UNIQUEインデックスの作成を妨げます。

クエリを実行して、重複があることを確認できます。

SELECT
    TopicShortName,
    COUNT(*)
FROM
    DimMeasureTopic
GROUP BY
    TopicShortName
HAVING
    COUNT(*) > 1

おそらく他のデータベースではデータが異なり、重複は存在しません。

于 2010-02-01T23:31:26.337 に答える
16

データに重複があります。このクエリを実行して見つけてください。

SELECT TopicShortName, COUNT(*)
FROM DimMeasureTopic
GROUP BY TopicShortName
HAVING COUNT(*) > 1
于 2010-02-01T23:32:03.927 に答える
6

これは、一意ではないレコードが既にテーブルにあるためです (TopicShortName フィールドの値が空白の 2 つのレコード)。

したがって、インデックス自体ではなく、データに関係しています。

于 2010-02-01T23:33:22.380 に答える
4

コードベースの移行を使用していて、エンティティのプロパティの名前を変更し、プロパティに一意のインデックスがある場合、エンティティ フレームワークは新しい列を作成し、新しい列に一意のインデックスを追加しようとしますが、新しい列はすべての null 値を持つため、失敗します。行の前に古い列からデータをコピーしてインデックスを作成するには、移行コードを手動で変更する必要があります。

于 2015-10-30T19:10:43.853 に答える