তিনটি কলামের মধ্যে একটির চেক সীমাবদ্ধ নন-নাল


61

আমার কাছে একটি (এসকিউএল সার্ভার) সারণী রয়েছে যার মধ্যে 3 ধরণের ফলাফল রয়েছে: ফ্লাট, এনভিচারার (30), বা ডেটটাইম (3 পৃথক কলাম)। আমি নিশ্চিত করতে চাই যে যে কোনও প্রদত্ত সারির জন্য, কেবলমাত্র একটি কলামের ফলাফল রয়েছে এবং অন্যান্য কলামগুলি নাল রয়েছে। এটি অর্জনের জন্য সহজ চেক সীমাবদ্ধতা কী?

এর জন্য প্রসঙ্গটি বিদ্যমান সিস্টেমে অ-সংখ্যাসূচক ফলাফল ক্যাপচার করার ক্ষমতাটি পুনঃনির্মাণের চেষ্টা করছে। সারি প্রতি একাধিক ফলাফল প্রতিরোধের জন্য সীমাবদ্ধতার সাথে টেবিলে দুটি নতুন কলাম যুক্ত করা সর্বাধিক অর্থনৈতিক পন্থা ছিল, অগত্যা সঠিকটি নয়।

আপডেট: দুঃখিত, তথ্য টাইপ snafu। দুর্ভাগ্যক্রমে আমি এসকিউএল সার্ভার ডেটাটাইপস হিসাবে ব্যাখ্যা করার জন্য নির্দেশিত ফলাফলের ধরণগুলি চাইছিলাম না, কেবল জেনেরিক পদগুলি, এখন ঠিক করা হয়েছে।

উত্তর:


72

নিম্নলিখিতটি কৌশলটি করা উচিত:

CREATE TABLE MyTable (col1 FLOAT NULL, col2 NVARCHAR(30) NULL, col3 DATETIME NULL);
GO

ALTER TABLE MyTable
ADD CONSTRAINT CheckOnlyOneColumnIsNull
CHECK 
(
    ( CASE WHEN col1 IS NULL THEN 0 ELSE 1 END
    + CASE WHEN col2 IS NULL THEN 0 ELSE 1 END
    + CASE WHEN col3 IS NULL THEN 0 ELSE 1 END
    ) = 1
)
GO

24

সীমাবদ্ধতার মধ্যে আপনার সম্ভবত তিনটি পরীক্ষা করা দরকার, প্রতিটি জোড়া যা আপনি নাল হতে চান তার একটি পরীক্ষা এবং কলামের জন্য একটি পরীক্ষা যা শূন্য হওয়া উচিত নয়:

ALTER TABLE table
ADD CONSTRAINT CK_one_is_null
CHECK (
     (col1 IS NOT NULL AND col2 IS NULL AND col3 IS NULL)
  OR (col2 IS NOT NULL AND col1 IS NULL AND col3 IS NULL) 
  OR (col3 IS NOT NULL AND col1 IS NULL AND col2 IS NULL)
);

এটি এতটা স্কেলযোগ্য নয়, আমার কাছে 9 টি বিদেশী কী সহ একটি টেবিল রয়েছে এবং কেবল একটিই শূন্য হওয়া উচিত নয়, আমি @ মার্কস্টোরী স্মিথের সমাধানটি পছন্দ করি
আমির পাশাজাদেহে

5

অন্তর্নির্মিত অ্যারে ফাংশনগুলি ব্যবহার করে এখানে পোস্টগ্রিসকিউএল সমাধান রয়েছে :

ALTER TABLE your_table
ADD chk_only_one_is_not_null CHECK (array_length(array_remove(ARRAY[col1::text, col2::text, col3::text], NULL), 1) = 1);

এটি পূর্বে উল্লিখিত CASE বা মার্ক / স্টোর এবং mrdenny দ্বারা যথাক্রমে পোস্ট করা সমাধানগুলির তুলনায় পোস্টগ্রিএসকিউএল-তে দ্রুত বাস্তবায়ন হবে কি?
ক্রিস ব্রিট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.