1

テーブル (データが含まれる既存のテーブル) があり、そのテーブルには列 UserName があります。この UserName は一意にする必要があります。したがって、次のような制約を追加します。

ALTER TABLE Users 
ADD CONSTRAINT [IX_UniqueUserUserName] UNIQUE NONCLUSTERED ([UserName])

今、重複したユーザーがこのテーブルに存在するというエラーが発生し続けます。しかし、次のクエリを使用してデータベースをチェックしました。

SELECT COUNT(UserId) as NumberOfUsers, UserName 
FROM Users 
GROUP BY UserName, UserId 
ORDER BY UserName

これにより、NumberOfUsers として 1 を持つすべてのユーザーのリストが作成されます。したがって、重複はありません。しかし、ユーザー名を確認すると、彼は失敗し、次の結果が表示されます。

beluga
béluga

どうやら彼は「e」と「é」または「è」の比較に失敗しています...彼はこれらを無視しているようです.SQLが一意のキー制約を追加するときにこれらのアクセントを無視しない方法はありますか.

解決:

THX 皆さん、私は解決策を見つけました。これで問題が解決しました:

ALTER TABLE Users 
ALTER COLUMN UserName nvarchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS
4

5 に答える 5

7

使用している照合では、比較時に大文字と小文字およびアクセントが無視される可能性が高くなります。照合を変更する必要があります。

  • Latin1_General_CI_AI大文字小文字とアクセント記号を無視
  • Latin1_General_CI_ASアクセントを無視しない

SQL サーバーの照合名のリストはこちらです。

于 2009-03-04T08:22:17.410 に答える
5

あなたのクエリも UserID でグループ化されています - あなたはそれをしたくありません。

使用する:

SELECT COUNT(*) as NumberOfUsers, UserName 
    FROM Users 
    GROUP BY UserName 
    ORDER BY UserName

クエリは、同じ名前と同じユーザー ID を持つユーザーのみを表示します。あるいは、COUNT(*)表示される最後の行がトラブルメーカーである可能性が最も高いように、データを並べ替えますか?

他の人が示唆しているように、照合に問題がある可能性もありますが、通常、GROUP BY は自己一貫性があります。

于 2009-03-04T08:23:31.057 に答える
2

おそらく UserId が主キーです。これはグループ化の一部であるため、グループごとに 1 つの行を取得することが保証されています。グループから「userId」列を取り出します。

于 2009-03-04T08:24:25.003 に答える
1

Andrew Barrett が言うように、MySQL のデフォルトの照合はアクセントを正しく認識しません。

フィールドの照合を に変更するUTF8_unicode_ciと、アクセントが正しく表示されるはずです。

ci は大文字と小文字を区別しないことを意味し、大文字と小文字が重要な場合は別の照合順序を使用できます。

新しい照合順序で新しいテーブルを作成し、* 既存のテーブルから新しいテーブルにコピーできます。

于 2009-03-04T08:23:30.807 に答える
0

また、(サーバー全体ではなく)関連する照合に関心のあるテーブルだけを作成することもできることに注意してください。したがって、次のようなこともできます。

CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )
于 2009-03-04T08:34:27.880 に答える