আমার কাছে একটি বড় ডাটাবেস রয়েছে যা আমাকে প্রতিটি টেবিল থেকে সমস্ত প্রাথমিক কী এবং বিদেশী কীগুলি বের করতে হবে।
আমার পিজিএডমিন তৃতীয় আছে।
এটি স্বয়ংক্রিয়ভাবে করার এবং প্রতিটি টেবিলে নিজে হাতে না যাওয়ার কোনও উপায় আছে কি?
আমার কাছে একটি বড় ডাটাবেস রয়েছে যা আমাকে প্রতিটি টেবিল থেকে সমস্ত প্রাথমিক কী এবং বিদেশী কীগুলি বের করতে হবে।
আমার পিজিএডমিন তৃতীয় আছে।
এটি স্বয়ংক্রিয়ভাবে করার এবং প্রতিটি টেবিলে নিজে হাতে না যাওয়ার কোনও উপায় আছে কি?
উত্তর:
আপনি pg_get_constraintdef(constraint_oid)
নীচের মত একটি ক্যোয়ারিতে ফাংশনটি ব্যবহার করতে পারেন :
SELECT conrelid::regclass AS table_from
, conname
, pg_get_constraintdef(oid)
FROM pg_constraint
WHERE contype IN ('f', 'p ')
AND connamespace = 'public'::regnamespace -- your schema here
ORDER BY conrelid::regclass::text, contype DESC;
ফলাফল:
table_from | conname | pg_get_constraintdef
------------+------------+----------------------
tbl | tbl_pkey | PRIMARY KEY (tbl_id)
tbl | tbl_col_fk | FOREIGN KEY (col) REFERENCES tbl2(col) ON UPDATE CASCADE
...
প্রদত্ত স্কিমাতে সমস্ত টেবিলের জন্য সমস্ত প্রাথমিক এবং বিদেশী কীগুলি টেবিলের নাম, পিকে দ্বারা প্রথমে অর্ডার করে দেয় s
ম্যানুয়াল সম্পর্কে pg_constraint
।
সম্পর্কে ম্যানুয়াল অবজেক্ট আইডেন্টিফায়ার ধরনের ( regclass
, regnamespace
, ...)।
এরউইন সমাধানের ভিত্তিতে:
SELECT conrelid::regclass AS "FK_Table"
,CASE WHEN pg_get_constraintdef(c.oid) LIKE 'FOREIGN KEY %' THEN substring(pg_get_constraintdef(c.oid), 14, position(')' in pg_get_constraintdef(c.oid))-14) END AS "FK_Column"
,CASE WHEN pg_get_constraintdef(c.oid) LIKE 'FOREIGN KEY %' THEN substring(pg_get_constraintdef(c.oid), position(' REFERENCES ' in pg_get_constraintdef(c.oid))+12, position('(' in substring(pg_get_constraintdef(c.oid), 14))-position(' REFERENCES ' in pg_get_constraintdef(c.oid))+1) END AS "PK_Table"
,CASE WHEN pg_get_constraintdef(c.oid) LIKE 'FOREIGN KEY %' THEN substring(pg_get_constraintdef(c.oid), position('(' in substring(pg_get_constraintdef(c.oid), 14))+14, position(')' in substring(pg_get_constraintdef(c.oid), position('(' in substring(pg_get_constraintdef(c.oid), 14))+14))-1) END AS "PK_Column"
FROM pg_constraint c
JOIN pg_namespace n ON n.oid = c.connamespace
WHERE contype IN ('f', 'p ')
AND pg_get_constraintdef(c.oid) LIKE 'FOREIGN KEY %'
ORDER BY pg_get_constraintdef(c.oid), conrelid::regclass::text, contype DESC;
ফর্মের একটি সারণী ফিরিয়ে দেবে:
| FK_Table | FK_Column | PK_Table | PK_Column |
পার্স করার দরকার নেই pg_get_constraintdef()
, অন্যান্য বিবরণ ( ডক্স ) pg_constraint
পেতে কেবল টেবিলের কলামগুলি ব্যবহার করুন ।
এখানে constraint_type
হতে পারে:
এরউইনের উত্তরের ভিত্তিতে :
SELECT c.conname AS constraint_name,
c.contype AS constraint_type,
sch.nspname AS "schema",
tbl.relname AS "table",
ARRAY_AGG(col.attname ORDER BY u.attposition) AS columns,
pg_get_constraintdef(c.oid) AS definition
FROM pg_constraint c
JOIN LATERAL UNNEST(c.conkey) WITH ORDINALITY AS u(attnum, attposition) ON TRUE
JOIN pg_class tbl ON tbl.oid = c.conrelid
JOIN pg_namespace sch ON sch.oid = tbl.relnamespace
JOIN pg_attribute col ON (col.attrelid = tbl.oid AND col.attnum = u.attnum)
GROUP BY constraint_name, constraint_type, "schema", "table", definition
ORDER BY "schema", "table";
ফলাফল দ্বারা আদেশ করা হয় schema
এবং table
।
প্রযুক্তিগত দ্রষ্টব্য: এই প্রশ্নটি সম্পর্কে দেখুন with ordinality
।
সম্প্রতি ডেটা অ্যাক্সেস লেয়ারের জন্য এটি প্রয়োগ করতে হয়েছিল যা তথ্য স্কিমার উপর ভিত্তি করে CRUD ইউটিলিটিগুলি তৈরি করে, এটি দিয়ে শেষ হয়েছিল।
SELECT
current_schema() AS "schema",
current_catalog AS "database",
"pg_constraint".conrelid::regclass::text AS "primary_table_name",
"pg_constraint".confrelid::regclass::text AS "foreign_table_name",
(
string_to_array(
(
string_to_array(
pg_get_constraintdef("pg_constraint".oid),
'('
)
)[2],
')'
)
)[1] AS "foreign_column_name",
"pg_constraint".conindid::regclass::text AS "constraint_name",
TRIM((
string_to_array(
pg_get_constraintdef("pg_constraint".oid),
'('
)
)[1]) AS "constraint_type",
pg_get_constraintdef("pg_constraint".oid) AS "constraint_definition"
FROM pg_constraint AS "pg_constraint"
JOIN pg_namespace AS "pg_namespace" ON "pg_namespace".oid = "pg_constraint".connamespace
WHERE
"pg_constraint".contype IN ( 'f', 'p' )
AND
"pg_namespace".nspname = current_schema()
AND
"pg_constraint".conrelid::regclass::text IN ('whatever_table_name')
WHERE contype IN ('f', 'p', 'u')