62

テーブル名を指定して、主キー列とそのデータ型のリストを plpgsql 関数から抽出するにはどうすればよいですか?

4

10 に答える 10

35

単純な SQL を提供するために、主キー列とその型を次のようにリストできます。

SELECT c.column_name, c.data_type
FROM information_schema.table_constraints tc 
JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name) 
JOIN information_schema.columns AS c ON c.table_schema = tc.constraint_schema
  AND tc.table_name = c.table_name AND ccu.column_name = c.column_name
WHERE constraint_type = 'PRIMARY KEY' and tc.table_name = 'mytable';
于 2012-04-02T23:45:56.153 に答える
4

pg_constraintシステムテーブルを見てください。またはinformation_schema.table_constraints、SQL 標準に近づきたい場合は、表示してください。

psql完全な例については、「- E」オプションとタイプを使用して DB に接続し\d <some_table>ます。テーブルの記述に使用される実際のクエリが表示されます。

于 2009-08-01T00:51:01.003 に答える
1

列の順序がテーブルの列の順序と異なるインデックスに注意してください。(つまり、主キーが列 3、2、および 1 を使用した場合)

次のクエリはさらに複雑ですが、適切な順序で列を返します。(「indisprimary」句を削除して、テーブルのすべてのインデックスについて同じ情報を取得します)

WITH ndx_list AS
(
    SELECT pg_index.indexrelid
      FROM pg_index, pg_class
     WHERE pg_class.relname = 'test_indices_table'
       AND pg_class.oid = pg_index.indrelid
       AND pg_index.indisprimary
), ndx_cols AS
(
   SELECT pg_class.relname AS index_name, UNNEST(i.indkey) AS col_ndx, i.indisunique, i.indisprimary
     FROM pg_class, pg_index i
    WHERE pg_class.oid = i.indexrelid
      AND pg_class.oid IN (SELECT indexrelid FROM ndx_list)
)
  SELECT ndx_cols.index_name, ndx_cols.indisunique, ndx_cols.indisprimary,
         a.attname, format_type(a.atttypid, a.atttypmod), a.attnum
    FROM pg_class c, pg_attribute a
    JOIN ndx_cols ON (a.attnum = ndx_cols.col_ndx)
   WHERE c.oid = 'test_indices_table'::regclass
     AND a.attrelid = c.oid
于 2015-02-23T19:00:45.597 に答える
1
SELECT
   conrelid::regclass AS table_from,
   conname,
   pg_get_constraintdef ( c.oid )
FROM
   pg_constraint c
   JOIN pg_namespace n ON n.oid = c.connamespace
WHERE
   contype IN ( 'f', 'p ' )
   AND conrelid::regclass::TEXT IN ( 'foo' )

ORDER BY
   conrelid::regclass::TEXT,
   contype DESC
于 2019-01-29T08:29:59.547 に答える
0

を使用して列の順序を保持するgenerate_subscripts:

SELECT
  a.attname,
  format_type(a.atttypid, a.atttypmod) 
FROM
  pg_attribute a
  JOIN (SELECT *, GENERATE_SUBSCRIPTS(indkey, 1) AS indkey_subscript FROM pg_index) AS i
    ON
      i.indisprimary
      AND i.indrelid = a.attrelid
      AND a.attnum = i.indkey[i.indkey_subscript]
WHERE
  a.attrelid = 'your_table'::regclass
ORDER BY
  i.indkey_subscript
于 2016-10-03T01:34:43.633 に答える