متعددة SQL تحديث البيانات أو واحد مع الحالة في ذلك ؟
-
08-07-2019 - |
سؤال
لقد بنيت الزناد حيث أحاول أن نضع الأولويات في النظام وعدم السماح مكررة أولوية القيم.هناك بعض الأشياء في الاعتبار.
- يمكن للمستخدم مجانا تشكل أولوية.
- لا يوجد شيء لمنعهم من قطف نفس أولوية عنصر آخر.
عندما تم إدخال قيمة تساوي قيمة أخرى حديثا الأولوية البند يجب أن تأخذ الأسبقية فى أولوية أخرى يجب أن تكون زيادة.
CREATE TRIGGER dbo.trg_Priority ON dbo.Stories AFTER INSERT,UPDATE,DELETE AS BEGIN SET NOCOUNT ON; -- Insert statements for trigger here DECLARE @StoryId INT DECLARE @OldLocation INT DECLARE @NewLocation INT SELECT @NewLocation = Priority, @StoryId = StoryId FROM INSERTED SELECT @OldLocation = Priority FROM DELETED IF @NewLocation = @OldLocation RETURN; IF @NewLocation IS NULL BEGIN UPDATE Stories SET Priority = Priority - 1 WHERE Priority > @OldLocation END IF @NewLocation > @OldLocation BEGIN UPDATE Stories SET Priority = Priority + 1 WHERE Priority >= @NewLocation AND StoryId <> @StoryId END IF @NewLocation < @OldLocation BEGIN UPDATE Stories SET Priority = Priority + 1 WHERE Priority >= @NewLocation AND Priority < @OldLocation AND StoryId <> @StoryId END END GO
لم يتم اختبار هذا الزناد الكثير حتى إذا كان هناك مجالات الاهتمام تتردد في الكلام.ما أنا في النهاية أريد أن أعرف إذا كان ينبغي لي أن محاولة تحويل هذا إلى تحديث واحد مع بيان حالة.(إذا كان هذا ممكنا)
إذا كان سيكون أكثر performant لجعل هذا واحد UPDATE
بيان أنا حقا يمكن استخدام اليد الاعتقاد بها!
المحلول
تحتاج إلى كتابة على الزناد.فإنه يفترض واحدة فقط السجلات سوف يكون من أي وقت مضى إدراج/تحديث أو delted في atime.لا يمكنك كتابة الزناد مع هذا الافتراض, مشغلات تعمل على دفعات من البيانات غير الصف byrow.تحتاج إلى الانضمام إلى إدراج و حذف التحديثات الخاصة بك.لذا نعم, أنا أحاول أن أكتب التحديث مع بيان حالة.
ولماذا هذا حذف الزناد ؟ لن;t أن arecord لتحديث إذا كان حذفها.
نصائح أخرى
تأكد من التراجع ورفع خطأ (شدة 16) إذا @@ROWCOUNT > 1.المشغل الخاص بك حاليا مكتوبة من شأنه أن يسبب قدرا كبيرا من البيانات الفساد المستخدم محاولة إدراج أو تحديث أو حذف صفوف متعددة في وقت واحد.
وقال IronGoofy هو الحق:سوف تكون فقط لمس الطاولة مرة واحدة ، بغض النظر إذا كان الشرط.حتى كسر ذلك في عدة تصريحات يجعل رمز أسهل للقراءة/أكثر للصيانة.
إذا كنت تسمح صفوف متعددة ليتم تحديثه في وقت واحد, سوف تحتاج إلى تغيير هذا.منطق قد تكون شاقة!
كيف حول هذا:
UPDATE Stories SET Priority = CASE
WHEN Priority > @OldLocation THEN Priority-1
WHEN Priority >= @NewLocation AND StoryID <> @StoryID THEN Priority+1
WHEN Priority >= @NewLocation AND @Priority < @OldLocation And StoryID <> StoryID THEN Priority +1
END
GO
لا ينبغي أن يكون هناك أي (ملحوظة) الفارق في الأداء, في أي حال سيتم إصدار تحديث واحد البيان إلى قاعدة البيانات.
قررت التخلي عن هذه الفكرة, و أترك واجهة المستخدم تحديث الأولوية.لقد توقفت عن السماح إدخال المستخدم.
أنا لست متأكدا من أي من هذه الإجابات صحيحة, لذلك أنا ذاهب للاحتفال بهذا النحو الصحيح والسماح للمجتمع معرفة ذلك مع التجربة والخطأ.:)