كيف يمكنني إنشاء قيد الطاولة لمنع القيم المكررة عبر عمودين؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

ولدي الجدول التالي:

CREATE TABLE [dbo].[EntityAttributeRelship](
    [IdNmb] [int] IDENTITY(1,1) NOT NULL,
    [EntityIdNmb] [int] NOT NULL,
    [AttributeIdNmb] [int] NOT NULL,
    [IsActive] [bit] NOT NULL CONSTRAINT [DF_EntityAttributeRelship_IsActive]  DEFAULT ((0)),
CONSTRAINT [PK_EntityAttributeRelship] PRIMARY KEY CLUSTERED 
([IdNmb] ASC) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]

وجزء من البيانات في الجدول يبدو وكأنه شيء هذا:

IdNmb    EntityIdNmb    AttributeIdNmb  IsActive
1        22             7               0
2        22             8               0
3        22             9               0
4        22             10              1

وأريد أن أضيف عائقا للتأكد من أن لا أحد يضيف أو بتحديث سجل لIsActive = 1، إذا كان هناك بالفعل الرقم القياسي لEntityIdNmb حيث IsActive = 1.

وكيف أفعل هذا؟

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم سيكلسرفير يمكنك إنشاء طريقة عرض مفهرسة عنقودية.

CREATE VIEW dbo.VIEW_EntityAttributeRelship WITH SCHEMABINDING AS
SELECT EntityIdNmb 
FROM dbo.EntityAttributeRelship
WHERE IsActive = 1
GO

CREATE UNIQUE CLUSTERED INDEX UIX_VIEW_ENTITYATTRIBUTERELSHIP 
  ON dbo.VIEW_EntityAttributeRelship (EntityIdNmb)

وهذا يضمن هناك EntityIdNmb واحد فقط في الجدول الخاص بك مع IsActive = 1.

نصائح أخرى

ويبدو أنك تحتاج إلى تنفيذ الزناد (على افتراض المنتج ديسيبل يدعم ذلك). إذا كنت تريد واحدة نشط واحد فقط دخول غير نشط، وفهرس فريد العمل. خلاف ذلك، سوف تحتاج إلى كتابة نوعا من القيد مخصص أو الزناد. (ربما 2 - واحدة للإدراج، واحدة للحصول على التحديثات) التي تجعل من أن لم يكن لديك 2 سجلات بالمعرف نفسه على حد سواء حيث تنشط

إذا كنت تستخدم MSSQL (أعتقد أن هذا ما يبدو في بناء الجملة الخاصة بك مثل)، بما في ذلك إنشاء طريقة عرض فقط الصفوف مع IsActive = 1، ثم وضع فهرس فريد على EntityIdNmb في طريقة العرض.

في الإنترنت، والتي عملت أكثر مع مؤخرا، يمكنك إنشاء فهرس الجزئي: http://www.postgresql.org/docs/8.3/interactive/ فهارس partial.html

والشيء مع الكتابة على الزناد هو أن تقرر ما إذا كنت تريد رفض السجل، تغيير القيمة إلى 0 بدلا من واحدة أو تحديث السجل القديم إلى الصفر، وترك هذا الوقوف صفا واحدا. إذا كنت تقوم بحذف السجل مع قيمة 1، هل تحتاج إلى تغيير رقم قياسي جديد لتكون واحدة نشطة، وكيفية القيام تختار أي واحد؟ مرة واحدة يمكنك تحديد WAHT تريد القيام به داخل المشغل، يمكننا مساعدتك بشكل أفضل لتصميم العملية.

ونحن نبذل خطوتين الأخيرة لجعل أي عنوان العنوان البريدي الرئيسي في قاعدة البيانات الخاصة بنا. حكم عملنا هو واحد وعنوان واحد فقط يمكن أن يكون واحد رئيسي وإذا كان هناك أي عناوين يجب أن يتم وضع علامة واحدة كما هو الرئيسي. المفتاح لهذا النوع من الزناد هو أن نتذكر أن إدراج / التحديثات / حذف يمكن أن يحدث في دفعات (حتى إذا كان هذا هو ليس القاعدة) وتأكد على الزناد يعمل بطريقة المستندة إلى مجموعة. عندما وصلت إلى هنا، ولنا تنفيذ المعالجات متعددة التوالي من خلال المؤشر الذي أصبح أمرا سيئا عندما أتيحت لي لتحديث 200،000 معالجة مشكلة في الاستيراد. (لاحظ لعديمي الخبرة - لا من أي وقت مضى استخدام المؤشر في مشغل)

وماذا سيتم استخدام السجلات غير النشطة ل؟ هم غير المستخدمة وببساطة هناك لتتبع سجلات نشطة مسبقا؟ إذا كان الأمر كذلك، فإنه سيكون من الممكن تقسيم البيانات في جداول متعددة؟ شيء من هذا القبيل ...

وEntityAttributeRelship (IDNmb، EntityIDNmb، AttributeIDNmb)

وEntityAttributeRelshipHistory (IDNmb، EntityIDNmb، AttributeIDNmb)

إذا كان في جدول EntityAttributeRelship، انها نشطة. لو كان في الجدول التاريخ ثم تم تفعيلها في مرحلة ما، ومنذ ذلك الحين تم إبطال مفعولها؟

إذا كنت بحاجة إلى كل شيء في جدول واحد اود ان اذهب مع اقتراح todd.run من استخدام الزناد.

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