دمج جهات الاتصال في جدول SQL دون إنشاء إدخالات مكررة
-
02-07-2019 - |
سؤال
لدي جدول يحتوي على عمودين فقط - ListID وPersonID.عندما يتم دمج شخص مع شخص آخر في النظام، كان علي أن أقوم بتحديث جميع المراجع من الشخص "المصدر" لتكون إشارات إلى الشخص "الوجهة".
من الناحية المثالية، أود أن أسمي شيئًا بسيطًا مثل
UPDATE MailingListSubscription
SET PersonID = @DestPerson
WHERE PersonID = @SourcePerson
ومع ذلك، إذا كان الشخص الوجهة موجودًا بالفعل في هذا الجدول بنفس معرف القائمة مثل الشخص المصدر، فسيتم إجراء إدخال مكرر.كيف يمكنني تنفيذ هذا الإجراء دون إنشاء إدخالات مكررة؟(معرف القائمة، معرف الشخص هو المفتاح الأساسي)
يحرر:يتم استخدام معرفات القائمة المتعددة.إذا تم تعيين SourcePerson لمعرفات القائمة 1 و2 و3، وتم تعيين DestinationPerson لمعرفات القائمة 3 و4، فيجب أن تحتوي النتيجة النهائية على أربعة صفوف - تم تعيين DestinationPerson لمعرف القائمة 1 و2 و3 و4.
المحلول
--out with the bad
DELETE
FROM MailingListSubscription
WHERE PersonId = @SourcePerson
and ListID in (SELECT ListID FROM MailingListSubscription WHERE PersonID = @DestPerson)
--update the rest (good)
UPDATE MailingListSubscription
SET PersonId = @DestPerson
WHERE PersonId = @SourcePerson
نصائح أخرى
يجب عليك أولاً الاشتراك في destperson في جميع القوائم التي اشترك فيها SourcePerson والتي لم يشترك فيها Destperson بالفعل.ثم قم بحذف كافة الاشتراكات SourcePersons.سيعمل هذا مع معرفات القائمة المتعددة.
Insert into MailingListSubscription
(
ListID,
PersonID
)
Select
ListID,
@DestPerson
From
MailingListSubscription as t1
Where
PersonID = @SourcePerson and
Not Exists
(
Select *
From MailingListSubscription as t2
Where
PersonID = @DestPerson and
t1.ListID = t2.ListID
)
Delete From MailingListSubscription
Where
PersonID = @SourcePerson
يجب أن أتفق مع ديفيد ب هنا.قم بإزالة جميع العناصر القديمة التي لا ينبغي أن تكون موجودة ثم قم بالتحديث.
في الواقع، أعتقد أنه يجب عليك العودة وإعادة النظر في تصميم قاعدة البيانات الخاصة بك حيث لا ينبغي أن تكون في ظروف تقوم فيها بتغيير المفتاح الأساسي لسجل كما تقترح القيام به - فهذا يعني أن عمود معرف الشخص ليس في الواقع مفتاح أساسي مناسب في المقام الأول.
أعتقد أن معرفك الشخصي قد تم كشفه للمستخدمين، وقد قاموا بإعادة ترقيم قاعدة البيانات الخاصة بهم لسبب ما وتقوم أنت بمزامنة التغيير مرة أخرى.تعتبر هذه فكرة سيئة عمومًا لأنها تكسر مسارات التدقيق والاتساق الزمني.في هذه الظروف، من الأفضل عمومًا استخدام مفتاحك الأساسي غير المتغير - عادة ما يكون هوية - وإعداد معرف الشخص الذي يراه المستخدمون كسمة لذلك.إنه عمل إضافي ولكنه سيمنحك المزيد من الاتساق والقوة على المدى الطويل.
القاعدة الأساسية الجيدة هي أن المفتاح الأساسي للسجل لا ينبغي كشفه للمستخدمين حيثما أمكن ذلك، ويجب عليك القيام بذلك فقط بعد دراسة متأنية.حسنًا، أعترف أنني كسرت هذا الأمر بنفسي في مناسبات عديدة ولكن الأمر يستحق أن نسعى جاهدين لتحقيق ما يمكنك :-)