postpresql 查詢某張表的字段名和字段類型

postpresql 查詢某張表的字段名和字段類型

工作中第一次接觸postpresql,接觸到這么個需求,只是對sql有點了解,于是就網上查閱資料。得知通過系統表可以查詢,設計到幾張系統表:pg_class、pg_attrubute、information_schema.columns 。

其中pg_class 這張表記錄了所有表或者像表的東西。包括表、索引、視圖、物化視圖、組合類型和TOAST表。其中一些字段的含義如下表所示。

? pg_class

字段名字段描述
oid表的唯一標識符(Object ID)
relname表的名稱
relnamespace表所屬的命名空間(pg_namespace 表的 oid)
reltype表的類型。對于表,這通常是 pg_type 表中的 oid
reloftype對于復合類型的表,它表示相關聯的基礎類型
relowner表的所有者(用戶的 oid)
relam索引使用的存儲方法的 oid
relfilenode表在磁盤上的文件節點號
reltablespace表所在的表空間的 oid
relpages表占用的頁數
reltuples表中的元組數。
reltoastrelid如果存在,指向 pg_class 中的 TOAST 表的 oid
reltoastidxid如果存在,指向 TOAST 表的索引的 oid
relhasindex表是否有索引
relisshared表是否是共享的
relpersistence表的持久性(永久的還是臨時的)
relkind表的類型,可能是 ‘r’(表)、‘i’(索引)等
relchecks表約束的數量
reltriggers表觸發器的數量
relhasrules表是否有規則
relhasoids表是否有 OIDs(Object Identifiers)

pg_attrubute

這張表包含了有關表的每一列的詳細信息,例如數據類型、是否為空等。

字段名字段描述
attrelid:屬性所屬的表的 OID。
attname:列名。
atttypid列的數據類型的 OID,對應于 pg_type 表中的 oid。
attstattarget用于統計信息的目標值。
attlen列的長度(以字節為單位)。
attnum列的序號。正整數表示用戶定義的列,0 表示系統列。
attndims數組的維數,如果不是數組則為 0。
attcacheoff用于計算偏移量的緩存位置。
atttypmod類型修飾符。對于 varchar(n) 這樣的類型,它存儲 n 的值。
attbyval如果列的傳遞是按值傳遞,則為 true;否則為 false。
attstorage列的存儲方式(‘p’ 表示普通、‘e’ 表示外部、‘m’ 表示主內存)。
attalign列的對齊方式(‘c’ 表示 CHAR、‘s’ 表示 SHORT、‘i’ 表示 INT、‘d’ 表示 DOUBLE)。
attnotnull如果列不允許為空,則為 true;否則為 false。
atthasdef如果列有默認值,則為 true;否則為 false。
attisdropped如果列已被刪除,則為 true;否則為 false。
attislocal如果列是表的本地列,則為 true;否則為 false。
attinhcount列是否繼承自父表。
attcollation列的排序規則的 OID。
attacl列的訪問控制列表。
attoptions列的選項。
attfdwoptions表示列是否有存儲外部化的選項。
attmissingval缺失值。

原本的想法,或者說是拿到的代碼。要查的是adb_task_daily_detail_log 這張表的字段類型和數據

-- 取字段名和字段類型
select
a.attname as name,
format_type(a.atttypid,a.atttypmod) as type,
col_description(a.attrelid,a.attnum) as comment,
a.attnotnull as notnull
from
pg_class as c,
pg_attribute as a
where
c.relname='adb_task_daily_detail_log'
and
a.attrelid=c.oid -- 關聯條件
and
a.attnum>0;

問題出現了,對于adb_task_daily_detail_log這張表,pg_class出現了2條記錄。

查了半天也搞不懂為什么有兩條記錄,如果有大哥知道的話請指導下小弟。

有說多一條索引,就會多一條記錄,但是這張表也沒有索引。

有說表記錄了TOAST相關的信息也會多存儲一條relkind =‘t’ 的記錄,但是這兩條記錄都是’r’。

所以后果就是查詢出來的字段數量會重復。

方式2:

查information_schema.columns

information_schema.columns 是 PostgreSQL 中的系統視圖之一,它存儲了數據庫中所有表的列信息。這個視圖允許用戶查詢表的元數據,包括列名、數據類型、是否為主鍵、是否允許為空等。

字段名稱字段描述
table_catalog表所屬的數據庫名稱。
table_schema表所屬的模式(Schema)名稱。
table_name表的名稱。
column_name列的名稱。
ordinal_position列在表中的位置,從 1 開始。
column_default列的默認值。
is_nullable如果列允許為 NULL,則為 “YES”;否則為 “NO”。
data_type列的數據類型。
character_maximum_length如果數據類型是字符型,則是字符的最大長度。
character_octet_length字符的八位字節長度。
numeric_precision如果數據類型是數字型,則是精度。
numeric_precision_radix數字的基數(通常為 10)。
numeric_scale如果數據類型是數字型,則是小數點后的位數。
datetime_precision如果數據類型是日期時間型,則是小數秒的位數。
interval_type如果數據類型是間隔型,則是間隔類型。
interval_precision如果數據類型是間隔型,則是間隔的精度。
character_set_catalog字符集所屬的數據庫名稱。
character_set_schema字符集所屬的模式名稱。
character_set_name字符集的名稱。
collation_catalog校對規則所屬的數據庫名稱。
collation_schem校對規則所屬的模式名稱。
collation_name校對規則的名稱。
domain_catalog如果列是域類型的基礎類型,則是基礎類型所屬的數據庫名稱。
domain_schema如果列是域類型的基礎類型,則是基礎類型所屬的模式名稱。
domain_name如果列是域類型的基礎類型,則是基礎類型的名稱。
select column_nameconcat(data_type,case when character_maximum_length is not null then '(' || character_maximum_length || ')'else ''end) as typefrom information_schema.columns
where table_name ='adb_task_daily_detail_log';

為了要使得數據類型和長度一起顯示 做了一個拼接,但是只有字符類型的數據才會被拼接。需求是對數字類型的數字也拼接。

format_type 這個函數得到的數據就是滿足要求的。

方式3:

select attname as nameformat_type (atttypeid,atttypmod) as typefrompg_attributewhereattrelid ='adb_task_daily_detail_log'::regclass and attnum>0;
  • ::regclass 是 PostgreSQL 的類型轉換語法。它將一個標識符(在這里是字符串 'adb_task_daily_detail_log')轉換為 regclass 類型。
  • attrelidpg_attribute 表中的一個字段,表示屬性(列)所屬的表的 OID。

所以,attrelid = 'adb_task_daily_detail_log'::regclass 這個條件是在過濾 pg_attribute 表的記錄,只選擇屬于名為 'adb_task_daily_detail_log' 的表的記錄。

這樣做是因為在 PostgreSQL 中,每個表都有一個唯一的 OID,而 pg_attribute 表存儲了關于表的每個列的信息。通過檢查 attrelid,我們可以限制結果只包括特定表的列信息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164099.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164099.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164099.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

axios二次封裝配置請求攔截器和響應攔截器

我們為什么要對axios進行二次封裝? 因為我們可以使用請求攔截器在發送請求之前處理一些業務,使用響應攔截器在服務器數據返回后處理一些業務。 我們通常創建一個api文件夾,再創建一個request.js文件,用于存放重寫后的axios。 /…

SiP系統級封裝、SOC芯片和合封芯片主要區別!合封和sip一樣嗎?

SiP系統級封裝、SOC芯片和合封芯片技術是三種備受關注的技術。它們在提高系統性能、穩定性和功耗效率方面都發揮著重要作用 但在集成方式、應用領域和技術特點等方面存在一些區別。本文將從多個角度對這三種技術進行深入解讀。 一、集成方式 合封芯片則是一種將多個芯片或不…

Vue彈窗的使用與傳值

使用element-UI中的Dialog 對話框 vue組件結合實現~~~~ 定義html <div click"MyAnalyze()">我的區劃</div><el-dialog title"" :visible.sync"dialogBiomeVisible"><NationalBiome :closeValue"TypeBiome" cl…

輕松入門Axios:前端開發中的HTTP利器

輕松入門Axios&#xff1a;前端開發中的HTTP利器 前言為什么選擇Axios1. **簡單易用:**2. **功能豐富:**3. **廣泛支持的瀏覽器和環境:**4. **跨域支持:**5. **社區活躍:**6. **對于處理錯誤的友好性:**7. **對于并發請求的支持:** 安裝與引用1. 使用 npm 安裝 Axios&#xff1…

基于51單片機車載空調系統設計proteus仿真+源程序)

一、系統方案 1、本設計采用這51單片機作為主控器。 2、DS18B20采集溫度值送到液晶1602顯示。 3、按鍵設置報警值。 4、溫度控制風扇檔位。 二、硬件設計 原理圖如下&#xff1a; 三、單片機軟件設計 1、首先是系統初始化 /T0初始化*/ void init_t0() { //TMOD0x01;//定時器…

數據庫實驗三 Sql多表查詢和視圖

數據庫實驗三 Sql多表查詢和視圖 一、Sql表二、在線練習 一、Sql表 www.db-book.com 二、在線練習 對所有表執行查詢語句&#xff0c;查看有哪些數據。 select * from tableName; 一、執行以下查詢語句&#xff0c;寫出查詢意圖。 (1) select * from student,takes whe…

經典滑動窗口試題(一)

&#x1f4d8;北塵_&#xff1a;個人主頁 &#x1f30e;個人專欄:《Linux操作系統》《經典算法試題 》《C》 《數據結構與算法》 ??走在路上&#xff0c;不忘來時的初心 文章目錄 一、將x減到0的最小操作數1、題目講解2、講解算法原理3、代碼實現 二、無重復的最長子串1、題…

OpenCV數據類型及CV_16UC1深度圖ros訂閱

最近用到深度圖,對其數據類型及顯示有些迷惑,記筆記于此: 目錄 一、cv::Mat 的數據類型及轉換方式1. cv::Mat 數據類型2. cv::Mat 數據類型互轉2.1 OpenCV數據類型轉換的函數2.2 可視化深度圖像(CV_16UC1)二、cv::Mat 與 sensor_msgs::msg::Image 互轉(基于cv_bridge)1.…

黑臭水體的“黑”和“臭”形成的機理

水體“黑”和“臭”即呈現令人不悅的顏色和(或)散發令人不適氣味的水體。由于水環境遭受超過其自凈能力的有機污染&#xff0c;有機物的好氧分解使水體中耗氧速率大于復氧速率&#xff0c;造成水體缺氧&#xff0c;致使有機物降解不完全、速度減緩&#xff0c;厭氧生物降解過程…

mybatis 語法使用各種踩坑(持續更新中。。。)

1、大小寫命名&#xff1a;這個別說了&#xff0c;都是淚。 2、聯表查詢查詢&#xff0c;多條合成一條&#xff0c;不生效的原因 博主各種檢查關聯關系和字段大小寫&#xff0c;本來是4條數據最后合成一條數據&#xff0c;死活給你直接返回了4條數據&#xff0c;而且每個類似p…

leetcode刷題之用棧實現隊列(C語言版)

leetcode刷題之用棧實現隊列&#xff08;C語言版&#xff09; 一、題目描述二、題目要求三、題目解析Ⅰ、typedef structⅡ、MyQueue* myQueueCreateⅢ、void myQueuePush(MyQueue* obj, int x)Ⅳ、int myQueuePeek(MyQueue* obj)Ⅴ、int myQueuePop(MyQueue* obj)Ⅶ、bool myQ…

邦芒忠告:求職者面試時絕不能說的8件事

求職者在面試時應該注意言行舉止&#xff0c;避免提及一些敏感或不合適的話題&#xff0c;以下是一些絕不能說的事情&#xff1a; 1、攻擊性言辭&#xff1a;不要使用攻擊性言辭&#xff0c;如貶低、批評或攻擊公司、同事或競爭對手等&#xff0c;這會給人留下不成熟、不尊重他…

新手必看!!附源碼!!STM32通用定時器-比較輸出PWM

一、什么是PWM? PWM&#xff08;脈沖寬度調制&#xff09;是一種用于控制電子設備的技術。它通過調整信號的脈沖寬度來控制電壓的平均值。PWM常用于調節電機速度、控制LED亮度、產生模擬信號等應用。 二、PWM的原理 PWM的基本原理是通過以一定頻率產生的脈沖信號&#xff0…

SPSS多元對應分析

前言&#xff1a; 本專欄參考教材為《SPSS22.0從入門到精通》&#xff0c;由于軟件版本原因&#xff0c;部分內容有所改變&#xff0c;為適應軟件版本的變化&#xff0c;特此創作此專欄便于大家學習。本專欄使用軟件為&#xff1a;SPSS25.0 本專欄所有的數據文件請點擊此鏈接下…

紅隊攻防實戰之釘釘RCE

我這一生如履薄冰&#xff0c;你說我能走到對岸嗎&#xff1f; 本文首發于SecIN社區&#xff0c;原創作者即是本人 前言 網絡安全技術學習&#xff0c;承認??的弱點不是丑事。只有對原理了然于?&#xff0c;才能突破更多的限制。擁有快速學習能力的白帽子&#xff0c;是不…

vue3 教程(中)

偵聽器 用于偵聽指定變量&#xff0c;當其響應式狀態變化時觸發回調函數。 watch() watch() 需明確指定偵聽的數據源&#xff0c;并且僅當數據源變化時&#xff0c;才會執行回調&#xff0c;在創建偵聽器時&#xff0c;不會執行回調&#xff0c;可以獲取到數據源變化前后的值…

Flutter 父子組件通信

在Flutter 中父組件調用子組件的方法可以通過GlobalKey實現&#xff0c;而子組件調用父組件方法可以通過回調函數實現。 父組件 class _MyHomePageState extends State<MyHomePage> {final GlobalKey<LoadPencilState> loadPencilKey GlobalKey<LoadPencilSt…

react中虛擬dom,diff,fiber - 初級了解

借鑒&#xff1a; 「React深入」一文吃透虛擬DOM和diff算法 - 掘金 (juejin.cn) 虛擬dom、fiber、渲染dom、dom-diff - 掘金 (juejin.cn) 未閱讀源碼&#xff0c;了解層面&#xff0c;后續可以深入了解 1.虛擬DOM ①.結構上&#xff1a;虛擬DOM比真實DOM輕很多 ②.操作上&…

主流的低代碼平臺有哪些?程序員應該如何與低代碼相處?

本文主要闡述低代碼的概念&#xff0c;介紹目前主流的低代碼平臺&#xff0c;總結低代碼平臺的典型特征、存在優勢以及未來發展趨勢。并站在程序員的角度&#xff0c;分析如何在已經到來的低代碼戰爭中&#xff0c;找到自己的定位&#xff0c;一展所長。 什么是低代碼&#xff…

脈沖寬度基礎知識簡介

脈沖寬度是指脈沖所能達到的最大值所持續的周期時間。脈沖寬度是電子領域中一個重要的概念&#xff0c;它與脈沖重復間隔和占空比等參數密切相關。 脈沖寬度通常用于電信號的測量&#xff0c;可以用來描述脈沖的形狀、幅度和寬度等特性。在雷達和電源領域中&#xff0c;脈沖寬度…