যদি এটি না থাকে তবে সূচক তৈরি করুন


60

আমি এমন একটি ফাংশনে কাজ করছি যা উপস্থিত না থাকলে আমাকে একটি সূচক যুক্ত করতে দেয়। আমি এমন সমস্যায় পড়ছি যে তুলনায় আমি সূচকের তালিকা পেতে পারি না। কোন চিন্তা?

এটি এই কোডটি দিয়ে সমাধান করা কলাম তৈরির অনুরূপ একটি সমস্যা:
https://stackoverflow.com/a/12603892/368511


আপনি চেষ্টা করতে পারেন: পিজি_ইনডেক্স থেকে সিলেক্ট করুন * যেখানে স্কিম্যানাম = '[স্কিমেনেম]' এবং সূচকনাম = '[সূচক নাম]'। [স্ক্যানামনাম] এবং [সূচকনাম] যথাযথ মানগুলির সাথে প্রতিস্থাপন করুন। সূত্র: postgresql.org/docs/9.1/static/view-pg-indexes.html
jbarrameda

উত্তর:


102

পোস্টগ্রাইএসকিউএল সূচক নাম

  • একক ডাটাবেস স্কিমা জুড়ে সূচকের নামগুলি অনন্য।
  • সূচির নামগুলি একই স্কিমায় অন্য কোনও সূচক, (বিদেশী) সারণী, (উপাদানযুক্ত) দর্শন, অনুক্রম বা ব্যবহারকারী-সংজ্ঞায়িত সংমিশ্রণের মতো হতে পারে।
  • একই স্কিমায় দুটি টেবিলের একই নামের সূচক থাকতে পারে না। (যৌক্তিকভাবে অনুসরণ করে))

আপনি যদি সূচকের নামটি যত্ন না করে থাকেন তবে পোস্টগ্রিসের এটির স্বয়ংক্রিয় নাম রাখুন:

CREATE INDEX ON tbl1 (col1);

(প্রায়) একই:

CREATE INDEX tbl1_col1_idx ON tbl1 USING btree (col1);

পোস্টগ্র্রেস নামকরণের সংঘর্ষ এড়াতে এবং পরবর্তী বিনামূল্যে নামটি স্বয়ংক্রিয়ভাবে বেছে নেবে:

tbl1_col1_idx 
tbl1_col1_idx2
tbl1_col1_idx3
...

এটা চেষ্টা করুন. তবে, স্পষ্টতই, আপনি একাধিক রিন্ডান্ট ইনডেক্স তৈরি করতে চান না । সুতরাং অন্ধভাবে একটি নতুন তৈরি করা ভাল ধারণা হবে না।

অস্তিত্বের জন্য পরীক্ষা

9.3 বা তার বেশি বয়সীদের পোস্টগ্র্যাগ করে

পরীক্ষার একটি খুব সহজ উপায় হ'ল এখানে স্কিমা-যোগ্য নামটি কাস্ট করা regclass:

SELECT 'myschema.myname'::regclass;

যদি এটি একটি ব্যতিক্রম ছুঁড়ে দেয় তবে নামটি বিনামূল্যে।
বা, কোনও DOবিবৃতিতে ব্যবহৃত ব্যতিক্রম নিক্ষেপ না করে একই পরীক্ষা করতে :

DO
$$
BEGIN
   IF NOT EXISTS (
      SELECT
      FROM   pg_class c
      JOIN   pg_namespace n ON n.oid = c.relnamespace
      WHERE  c.relname = 'mytable_mycolumn_idx'
      AND    n.nspname = 'myschema'
   ) THEN

        CREATE INDEX mytable_mycolumn_idx ON myschema.mytable (mycolumn);
    END IF;
END
$$;

এটি এর জন্য কার্যকর হয় না CREATE INDEX CONCURRENTLY, যেহেতু var রূপটি বাইরের লেনদেনে মোড়ানো যায় না। নীচে @ গ্রেগরি দ্বারা মন্তব্য দেখুন ।

DOবিবৃতি Postgres 9.0 সঙ্গে চালু করা হয়। পূর্ববর্তী সংস্করণগুলিতে আপনাকে একই কাজ করতে একটি ফাংশন তৈরি করতে হবে। ম্যানুয়াল
সম্পর্কে বিশদ । ম্যানুয়ালটিতে সূচী সম্পর্কে মূল কথা ।pg_class

পোস্টগ্রাগেস 9.4

আপনি to_regclass()কোনও ব্যতিক্রম না ছুড়ে চেক করতে নতুন ফাংশনটি ব্যবহার করতে পারেন :

DO
$$
BEGIN
   IF to_regclass('myschema.mytable_mycolumn_idx') IS NULL THEN
      CREATE INDEX mytable_mycolumn_idx ON myschema.mytable (mycolumn);
   END IF;

END
$$;

সেই নামের কোনও সূচক (বা অন্য কোনও বস্তু) উপস্থিত না থাকলে NULL প্রদান করে। দেখা:

পোস্টগ্র্যাস 9.5

এখন উপলভ্য:

CREATE INDEX IF NOT EXISTS ...

যে এছাড়াও জন্য কাজ করে CREATE INDEX CONCURRENTLY IF NOT EXISTS

তবে ম্যানুয়ালটি সতর্ক করে দিয়েছে :

মনে রাখবেন যে বিদ্যমান সূচকটি তৈরি করা হয়েছে এমন কিছু হওয়ার কোনও গ্যারান্টি নেই।

এটি বস্তুর নামের জন্য একটি সরল চেক। এখানে সমস্ত বৈকল্পিকের জন্য প্রযোজ্য।


7
দুর্দান্ত উত্তর হওয়ার সময়, নোট করুন যে আপনি CONCURRENTLYএভাবে সূচীগুলি যুক্ত করতে পারবেন না । আপনি পাবেন ERROR: CREATE INDEX CONCURRENTLY cannot be executed from a function or multi-command string
গ্রেগলটসভ 11

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