قيد فريد على عمود الجدول
-
03-07-2019 - |
سؤال
لدي جدول (جدول موجود به بيانات) ويحتوي هذا الجدول على عمود اسم المستخدم.أريد أن يكون اسم المستخدم هذا فريدًا.لذلك أقوم بإضافة قيد مثل هذا:
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
ينتج عن هذا قائمة بالمستخدمين الذين لديهم جميعًا الرقم 1 كـ NumberOfUsers.لذلك لا التكرارات هناك.لكن عندما أتحقق من اسم المستخدم الذي فشل فيه أرى النتيجة التالية:
beluga
béluga
لذا فمن الواضح أنه فشل في مقارنة "e" و"é" أو "è" ...يبدو الأمر كما لو أنه يتجاهل هذه العلامات، هل هناك أي طريقة بحيث لا يتجاهل SQL هذه العلامات عند إضافة قيد المفتاح الفريد.
حل:
شكرا لكم يا رفاق لقد وجدت الحل.هذا حل المشكلة:
ALTER TABLE Users
ALTER COLUMN UserName nvarchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS
المحلول
من المرجح أن يتجاهل الترتيب الذي تستخدمه حالة الأحرف واللهجات عند المقارنة.سوف تحتاج إلى تغيير الترتيب.
Latin1_General_CI_AI
يتجاهل حالة الأحرف واللهجاتLatin1_General_CI_AS
لن نتجاهل اللهجات
قائمة بأسماء ترتيب خادم SQL هنا.
نصائح أخرى
والجماعات الاستعلام الخاص بك عن طريق معرف المستخدم أيضا - كنت لا تريد أن تفعل ذلك
استخدم:
SELECT COUNT(*) as NumberOfUsers, UserName
FROM Users
GROUP BY UserName
ORDER BY UserName
واستفسارك عن أن تظهر فقط للمستخدمين بنفس الاسم والرقم المستخدم نفسه. أو، ربما، أن تأمر البيانات بواسطة COUNT(*)
ذلك هو على الأرجح الصف الأخير الذي يظهر المشاكس؟
هل يمكن أن يكون أيضا مشاكل مع الترتيب كما فعل آخرون قد اقترح، ولكن عادة، فإن GROUP BY تكون متسقة ذاتيا.
ويفترض معرف المستخدم هو المفتاح الأساسي. لأنه جزء من ما كنت التجمع من قبل، ويضمن لك الحصول على صف واحد لكل مجموعة. خذ العمود "حاليا" للخروج من مجموعتك التي كتبها.
وكما يقول أندرو باريت، الترتيب الافتراضي في الخلية لا توجد الآن لا تعترف هجات بشكل صحيح.
وتغيير الترتيب من الحقول إلى UTF8_unicode_ci
و أنه يجب أن نرى لهجات بشكل صحيح.
وCI يعني حالة حساسة، ويمكنك استخدام ترتيب مختلف إذا القضية الهامة.
يمكنك إنشاء جدول جديد مع الترتيب الجديد، ثم نسخ * من الجدول الموجود في واحدة جديدة.
لاحظ أيضا أنه يمكنك أيضا إنشاء مجرد طاولة كنت مهتما في الترتيب relevent عن (بدلا من الخادم واسعة). حتى انك يمكن أيضا أن تفعل شيئا مثل:
CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )