পোস্টগ্র্যাস্কল: শর্তসাপেক্ষে অনন্য বাধা


116

আমি একটি সীমাবদ্ধতা যুক্ত করতে চাই যা কেবল একটি টেবিলের একটি অংশে কলামে স্বতন্ত্রতা প্রয়োগ করে।

ALTER TABLE stop ADD CONSTRAINT myc UNIQUE (col_a) WHERE (col_b is null);

WHEREঅংশ উপরে ইচ্ছামত চিন্তা নয়।

এটি করার কোনও উপায়? নাকি আমাকে রিলেশনাল ড্রয়িং বোর্ডে ফিরে যেতে হবে?


2
সাধারণভাবে সম্পন্ন। "আংশিক অনন্য সূচক" দেখুন
ক্রেগ রিঞ্জার

11
@Yvesonline না, এটি নিয়মিত অনন্য বাধা। পোস্টারটি একটি আংশিক অনন্য বাধা চায় ।
ক্রেগ রিঞ্জার

উত্তর:


186

পোস্টগ্রিসকিউএল আংশিক (যেমন শর্তসাপেক্ষ) UNIQUEসীমাবদ্ধতা সংজ্ঞায়িত করে না - তবে আপনি আংশিক অনন্য সূচক তৈরি করতে পারেন । পোস্টগ্রেএসকিউএল অনন্য সীমাবদ্ধতাগুলি প্রয়োগ করতে অনন্য সূচকগুলি ব্যবহার করে, সুতরাং প্রভাবটি একই রকম, আপনি কেবল তালিকাবদ্ধ সীমাবদ্ধতা দেখতে পাবেন না ।information_schema

CREATE UNIQUE INDEX stop_myc ON stop (col_a) WHERE (col_b is NOT null);

দেখুন আংশিক ইনডেক্স


24
সুপার! অনিচ্ছাকৃত যে "প্রতিবন্ধকতা" একটি সীমাবদ্ধতা হিসাবে দেখায় না, তবে তা সত্ত্বেওERROR: duplicate key value violates unique constraint "stop_myc"
EoghanM

7
এটি লক্ষণীয় যে এটি আংশিকভাবে অনন্য ক্ষেত্রের এফকে রেফারেন্সিগ তৈরি করতে দেয় না।
ffflabs

11
এটিও লক্ষণীয় যে এই সূচকগুলির প্রভাব স্থগিত করা যায় না। যদি আপনার প্রচুর পরিমাণে আপডেট করার প্রয়োজন হয় তবে এটি একটি সমস্যা তৈরি করতে পারে কারণ প্রতিটি সারির পরে স্বতন্ত্রতা পরীক্ষা করা হয়, বিবৃতি দেওয়ার পরে যেমন এটি কোনও বাধা নয় বা লেনদেনের পরে যেমন এটি কোনও স্থগিতকারী বাধা হয়ে থাকে।
sage88

37

এটি ইতিমধ্যে বলা হয়েছে যে পিজি কোনও আংশিক (অর্থাত্ শর্তযুক্ত) অনন্য প্রতিবন্ধকতার সংজ্ঞা দেয় না। এছাড়াও ডকুমেন্টেশন বলে যে কোনও টেবিলে একটি অনন্য বাধা যুক্ত করার পছন্দের উপায়টি হল ADD CONSTRAINT অনন্য সূচক

কোনও টেবিলে একটি অনন্য বাধা যুক্ত করার পছন্দের উপায় হ'ল ALTER TABLE ... সংযুক্তি যুক্ত করুন। অনন্য প্রতিবন্ধকতাগুলি প্রয়োগ করতে সূচকগুলির ব্যবহার এমন একটি বাস্তবায়ন বিশদ হিসাবে বিবেচনা করা যেতে পারে যা সরাসরি অ্যাক্সেস করা উচিত নয়। তবে একটি সচেতন হওয়া উচিত যে অনন্য কলামগুলিতে ম্যানুয়ালি সূচি তৈরি করার দরকার নেই; এটি করার ফলে কেবল স্বয়ংক্রিয়ভাবে তৈরি সূচকটি নকল হবে।

বহির্ভূত সীমাবদ্ধতাগুলি ব্যবহার করে এটি বাস্তবায়নের একটি উপায় রয়েছে , (এই সমাধানের জন্য @ ডুয়ালিয়ন ধন্যবাদ)

আপনার ক্ষেত্রে এটির মতো দেখাবে

ALTER TABLE stop ADD CONSTRAINT myc EXCLUDE (col_a WITH =) WHERE (col_b IS null);

সেই পদ্ধতির উপর আপনি সূচী পদ্ধতিটি সংজ্ঞায়িত করতে "ব্যবহার করে" ব্যবহার করেন না, যাতে এটি অত্যন্ত ধীর হতে পারে বা পোস্টগ্রাসগুলি এতে একটি ডিফল্ট সূচক তৈরি করতে পারে? এই পদ্ধতিটি ক্যানোনিকাল পছন্দ, তবে এর চেয়ে ভাল পছন্দ নয়! আমি মনে করি আপনার পছন্দটিকে আরও ভাল করে তুলতে আপনার সূচকের সাথে "ব্যবহার" শর্ত প্রয়োজন।
নাটান মেডিইরোস

10
ধীরে ধীরে, বাদ দেওয়ার সমাধানের সুবিধাটি হ'ল এটি স্থলযোগ্য (এবং বিবৃতিটি শেষ না হওয়া অবধি ডিফল্ট ডিফার্স করে)। বিপরীতে, স্বীকৃত অনন্য সূচক সমাধান স্থগিত করা যায় না (এবং প্রতিটি সারি পরিবর্তনের পরে পরীক্ষা করা হয়)। সুতরাং একটি বাল্ক আপডেট প্রায়শই সম্ভব হয় না কারণ আপডেটের সময় পদক্ষেপগুলি অনন্য প্রতিবন্ধকতা লঙ্ঘন করে, এমনকি যদি এটি পারমাণবিক আপডেটের বিবৃতি শেষে লঙ্ঘন না হয়।
সেজে 88

1
এই নোটটি আগস্ট 2015
রানিজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.