সমস্ত পিকে এবং এফকে পুনরুদ্ধার করা হচ্ছে


18

আমার কাছে একটি বড় ডাটাবেস রয়েছে যা আমাকে প্রতিটি টেবিল থেকে সমস্ত প্রাথমিক কী এবং বিদেশী কীগুলি বের করতে হবে।

আমার পিজিএডমিন তৃতীয় আছে।

এটি স্বয়ংক্রিয়ভাবে করার এবং প্রতিটি টেবিলে নিজে হাতে না যাওয়ার কোনও উপায় আছে কি?

উত্তর:


29

আপনি 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, ...)।


1
এটি পরিবর্তিত হয়েছে যেখানে শর্তটি যে কোনও অনন্য বাধাও প্রদান করে:WHERE contype IN ('f', 'p', 'u')
ড্যানিয়েল ওয়াল্ট্রিপ

8

এরউইন সমাধানের ভিত্তিতে:

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 |

4

পার্স করার দরকার নেই 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


1

সম্প্রতি ডেটা অ্যাক্সেস লেয়ারের জন্য এটি প্রয়োগ করতে হয়েছিল যা তথ্য স্কিমার উপর ভিত্তি করে 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')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.