এটি নির্ভর করে আপনি ঠিক কী পরীক্ষা করতে চান ।
তথ্য স্কিম?
"সারণীটি বিদ্যমান কিনা" ( যারা জিজ্ঞাসা করছে না ) সন্ধানের জন্য, তথ্য স্কিমার ( information_schema.tables
) কে জিজ্ঞাসাবাদ করা ভুল , কঠোরভাবে বলা হচ্ছে, কারণ ( প্রতি ডকুমেন্টেশন ):
কেবলমাত্র সেই টেবিলগুলি এবং দর্শনগুলি দেখানো হয়েছে যে বর্তমান ব্যবহারকারীর অ্যাক্সেস রয়েছে (মালিক হওয়ার উপায় বা কোনও সুযোগ সুবিধা পাওয়ার কারণে)।
@ কোংয়ের সরবরাহ করা ক্যোয়ারী ফিরে আসতে পারে FALSE
তবে সারণীটি এখনও বিদ্যমান থাকতে পারে। এটি প্রশ্নের উত্তর:
কোনও টেবিল (বা দেখুন) বিদ্যমান আছে এবং বর্তমান ব্যবহারকারীর এতে অ্যাক্সেস রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_schema = 'schema_name'
AND table_name = 'table_name'
);
তথ্য স্কিমা মূল সংস্করণ এবং বিভিন্ন আরডিবিএমএস জুড়ে বহনযোগ্য থাকার জন্য দরকারী। তবে বাস্তবায়ন ধীর, কারণ পোস্টগ্র্রেসকে মান মেনে চলার জন্য পরিশীলিত দৃষ্টিভঙ্গি ব্যবহার করতে হবে ( information_schema.tables
এটি একটি সহজ উদাহরণ)। এবং কিছু তথ্য (যেমন ওআইডি) সিস্টেম ক্যাটালগগুলি থেকে অনুবাদে হারিয়ে যায় - যা আসলে সমস্ত তথ্য বহন করে।
সিস্টেম ক্যাটালগ
আপনার প্রশ্ন ছিল:
টেবিলের অস্তিত্ব আছে কিনা তা কীভাবে পরীক্ষা করবেন?
SELECT EXISTS (
SELECT FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'schema_name'
AND c.relname = 'table_name'
AND c.relkind = 'r' -- only tables
);
সিস্টেম ক্যাটালগগুলি pg_class
এবং pg_namespace
সরাসরি ব্যবহার করুন , এটিও যথেষ্ট দ্রুত। যাইহোক, প্রতি নথি প্রতিpg_class
:
ক্যাটালগ pg_class
ক্যাটালগ টেবিল এবং অন্য অধিকাংশ সবকিছু যে কলাম আছে বা অন্যথায় একটি টেবিলে অনুরূপ। এর মধ্যে সূচীগুলি (তবে আরও দেখুন pg_index
), সিকোয়েন্স , ভিউ , উপাদানযুক্ত দর্শন , সমন্বিত প্রকার এবং টোস্ট সারণী অন্তর্ভুক্ত রয়েছে ;
এই নির্দিষ্ট প্রশ্নের জন্য আপনি সিস্টেমের ভিউটিওpg_tables
ব্যবহার করতে পারেন । প্রধান পোস্টগ্রাস সংস্করণগুলিতে কিছুটা সহজ এবং আরও বহনযোগ্য (যা এই প্রাথমিক ক্যোয়ারির জন্য উদ্বেগের বিষয় নয়):
SELECT EXISTS (
SELECT FROM pg_tables
WHERE schemaname = 'schema_name'
AND tablename = 'table_name'
);
উপরে বর্ণিত সমস্ত বস্তুর মধ্যে শনাক্তকারীদের অনন্য হতে হবে । যদি আপনি জানতে চান:
প্রদত্ত স্কিমাতে কোনও টেবিলের অনুরূপ বা অনুরূপ অবজেক্টের নাম নেওয়া হয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?
SELECT EXISTS (
SELECT FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'schema_name'
AND c.relname = 'table_name'
);
বিকল্প: castালাই regclass
SELECT 'schema_name.table_name'::regclass
(Allyচ্ছিকভাবে স্কিমা-যোগ্য) টেবিল (বা সেই নামটি দখল করা অন্য কোনও বস্তু) উপস্থিত না থাকলে এটি একটি ব্যতিক্রম উত্থাপন করে।
তুমি কি সারণী নাম, এর একটি ঢালাই স্কিমা-যোগ্যতা অর্জন করেন তাহলে regclass
ডিফল্ট search_path
এবং আয় প্রথম টেবিলের জন্য OID পাওয়া যায় নি - বা একটি ব্যতিক্রম যদি টেবিল তালিকাভুক্ত স্কিমের কেউই হয়। নোট করুন যে সিস্টেম স্কিমা pg_catalog
এবং pg_temp
(বর্তমান সেশনের অস্থায়ী বস্তুর জন্য স্কিমা) স্বয়ংক্রিয়ভাবে এর অংশ search_path
।
আপনি এটি ব্যবহার করতে পারেন এবং একটি ফাংশনে একটি সম্ভাব্য ব্যতিক্রম ধরতে পারেন। উদাহরণ:
উপরের মতো একটি কোয়েরি সম্ভাব্য ব্যতিক্রমগুলি এড়িয়ে চলে এবং তাই কিছুটা দ্রুত।
এখন অনেক সহজ:
SELECT to_regclass('schema_name.table_name');
Castালাই হিসাবে একই, কিন্তু এটি ফিরে ...
... নাম না পাওয়া গেলে ত্রুটি ছুঁড়ে ফেলার চেয়ে নাল
[[ `psql dbname -tAc "SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'ejabberd' AND table_name = 'users');"` = 't' ]]