給定一個表名,我如何從plpgsql函數中提取主鍵列及其數據類型的列表?如何通過plpgsql從Postgres獲取表的主鍵?
回答
上面的查詢是非常糟糕的,因爲它實在是太慢了。
我會推薦這正式版:
http://wiki.postgresql.org/wiki/Retrieve_primary_key_columns
是否需要架構查詢是如下
SELECT
pg_attribute.attname,
format_type(pg_attribute.atttypid, pg_attribute.atttypmod)
FROM pg_index, pg_class, pg_attribute, pg_namespace
WHERE
pg_class.oid = 'foo'::regclass AND
indrelid = pg_class.oid AND
nspname = 'public' AND
pg_class.relnamespace = pg_namespace.oid AND
pg_attribute.attrelid = pg_class.oid AND
pg_attribute.attnum = any(pg_index.indkey)
AND indisprimary
看看pg_constraint
系統表。或者如果您願意堅持接近SQL標準,則可以使用information_schema.table_constraints
視圖。
有關完整示例,請使用帶「-E」選項的psql
連接到數據庫,並鍵入\d <some_table>
- 您將看到用於描述表的實際查詢。
此外,從pg_indexes數據結合這一點,你應該還不錯。真正的主鍵只是一個唯一索引,在所有字段上都不爲空。 – 2009-08-27 20:16:33
提供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';
當我在我的postgres服務器上運行這個時,我得到一個空的結果集。在你問之前,我沒有用正確的表名替換`mytable'。我是否需要在特定的環境或範圍內才能使用? – 2mac 2015-07-22 12:27:31
謹防指標,其中列的順序從表中的列的順序不同。 (即,如果主鍵使用,2列3和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
保留使用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
以下SQL
語句對我的作品:
SELECT a.attname
FROM pg_index i
JOIN pg_attribute a ON a.attrelid = i.indrelid
AND a.attnum = ANY(i.indkey)
WHERE i.indrelid = 'tablename'::regclass
AND i.indisprimary;
它是直接從here拍攝。
- 1. 通過查詢獲取表主鍵列
- 2. 如何獲取plpgsql函數中的表的關鍵字段?
- 3. 如何通過表名PLPGSQL功能
- 4. Postgres PLpgSQL JSON SUM
- 5. 如何通過外鍵連接從其他表中獲取值?
- 6. 如何通過JObject的鍵獲取值?
- 7. 如何通過主鍵
- 8. 獲取表的主鍵名
- 9. 獲取表的主鍵?
- 10. 如何通過JSON鍵獲取值?
- 11. 如何通過鍵獲取地圖值?
- 12. 使用值/ values_list通過反向ForeignKey獲取主鍵列表
- 13. 如何從列中獲取列是否爲表的主鍵?
- 14. Postgres主鍵Synchornized
- 15. 從SP獲取主鍵
- 16. 從插入獲取主鍵
- 17. 從dbSet獲取主鍵列
- 18. SAS獲取表主鍵
- 19. 通過npgsql獲取postgres消息
- 20. 如何使用正則表達式從URL獲取主鍵?
- 21. 如何從表中單獨獲取主鍵
- 22. 通過Rails中的外鍵從表中獲取值?
- 23. 如何通過嵌套在列表中的鍵從字典中獲取元素?
- 24. 如何通過匹配鍵從字符串中獲取值?
- 25. 如何從模型中通過外鍵獲取記錄yii
- 26. 如何通過鍵從JSON對象獲取值?
- 27. 在散列表中,如何通過鍵獲取對象值?
- 28. 如何獲取表和主鍵,並在表沒有主鍵時顯示null?
- 29. 如何通過jdbc在postgres中獲取數組基類型
- 30. 如何獲取主鍵的值?
我很確定你不需要加入pg_namespace。 pg_class的oid是唯一的,因此當您將它轉換爲regclass時,您已經暗示了該模式的名稱。如果您需要模式名稱,請將其包含在表名中:'public.foo':: regclass。 – 2017-10-03 10:40:29