دمج جهات الاتصال في جدول SQL دون إنشاء إدخالات مكررة

StackOverflow https://stackoverflow.com/questions/135173

  •  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

يجب أن أتفق مع ديفيد ب هنا.قم بإزالة جميع العناصر القديمة التي لا ينبغي أن تكون موجودة ثم قم بالتحديث.

في الواقع، أعتقد أنه يجب عليك العودة وإعادة النظر في تصميم قاعدة البيانات الخاصة بك حيث لا ينبغي أن تكون في ظروف تقوم فيها بتغيير المفتاح الأساسي لسجل كما تقترح القيام به - فهذا يعني أن عمود معرف الشخص ليس في الواقع مفتاح أساسي مناسب في المقام الأول.

أعتقد أن معرفك الشخصي قد تم كشفه للمستخدمين، وقد قاموا بإعادة ترقيم قاعدة البيانات الخاصة بهم لسبب ما وتقوم أنت بمزامنة التغيير مرة أخرى.تعتبر هذه فكرة سيئة عمومًا لأنها تكسر مسارات التدقيق والاتساق الزمني.في هذه الظروف، من الأفضل عمومًا استخدام مفتاحك الأساسي غير المتغير - عادة ما يكون هوية - وإعداد معرف الشخص الذي يراه المستخدمون كسمة لذلك.إنه عمل إضافي ولكنه سيمنحك المزيد من الاتساق والقوة على المدى الطويل.

القاعدة الأساسية الجيدة هي أن المفتاح الأساسي للسجل لا ينبغي كشفه للمستخدمين حيثما أمكن ذلك، ويجب عليك القيام بذلك فقط بعد دراسة متأنية.حسنًا، أعترف أنني كسرت هذا الأمر بنفسي في مناسبات عديدة ولكن الأمر يستحق أن نسعى جاهدين لتحقيق ما يمكنك :-)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top