Belirtilen bir tablonun tüm sütunlarını nasıl listelerim?


158

Hiçbir bilgim olmayan bir veritabanında kesin bir bilgi parçası arıyorum.

Bu bir üçüncü taraf ürünüdür, bazı soruları cevaplama konusunda yavaşlar ve verilerin bu db'nin içinde olduğunu biliyorum, bu yüzden biraz retro mühendisliği yapmak istiyorum.

Bir tablo verildiğinde, bu tablo için sütunların adlarının bir listesine sahip olmak mümkün müdür?

Örneğin, SqlServer'da, bir tabloyu, tablonun oluşturduğu tüm sütunları metinsel olarak listeleyen yeniden kullanılabilir CREATE ifadelerine dökmek mümkündür.

  0

DB'ye ne tür erişiminiz var? 13 ağu. 122012-08-13 12:49:57

  0

@dezso, ayrı bir makinede, ancak oturum açabilir ve yönetici haklarıyla psql komut satırını başlatabilirim 13 ağu. 122012-08-13 12:54:37

+4

Sizi doğru anlarsam, psql 'de' \ dt [+] table_name 'den sonra gelirsiniz. 13 ağu. 122012-08-13 13:03:09

+1

Hayır.\ dt + açıkça sütunların adını göstermiyor.sadece bir "Açıklama" alanı ekler. 13 ağu. 122012-08-13 13:16:51

+7

ama \ d + tablo adı çalışıyor! 13 ağu. 122012-08-13 13:18:12

197

Komut satırından ek olarak \d+ zaten buldum, ayrıca kullanabilirsiniz Information Schema kullanarak, sütun veri aramak için information_schema.columns :

SELECT *
FROM information_schema.columns
WHERE table_schema = 'your_schema'
    AND table_name  = 'your_table'

Not: Yukarıdaki örneğe göre, değerlerin tırnak içine alındığından emin olun.

  0

Psql'de, sorgu sonuçlarını doğrusal hale getirmek için (tablo yerine) '\ x on' veya' \ pset genişletilmiş 'kullanın ve bu nedenle https://stackoverflow.com/a/9605093/513397 07 eyl. 172017-09-07 22:46:06

+1

Geçerli sürümlerde (9.6'da denendi) psql '\ d + public. *' Da, genel tablodaki tüm tabloların ve görünümlerin açıklamasını (şema + indeces/fkeys/triggers) yapabilirsiniz.Her işlem tarafından yapılan DB değişikliklerini takip etmek için işlem öncesi kanca komut dosyasında kullanıyoruz. 23 eki. 172017-10-23 18:30:47

+1

Yalnızca sütun adını almak için sütun_adı SEÇİN 22 şub. 182018-02-22 16:56:14


54

information schemayavaş ve emin bir şekilde: standardize edilmiş ve büyük oranda onu destekleyen diğer veritabanlarına taşınabilir.Ve büyük sürümlerde çalışmaya devam edecek.

Ancak,görünümlerbilgi şemasında çoğu kez birçok tabloda yer almaktadır.system catalogsKesinlikle standart hale getirilmiş bir formatta bir araya gelmek için - çoğu zaman sadece ölü navlun olan.Bu onları yaparyavaş.
Postgres geliştiricileri umut vaat etmiyorlar, ancak temeller (burada ihtiyaç duyulan gibi) ana sürümler arasında değişmeyecek.

psql(yerel komut satırı arayüzü) elbette hızlı şeridi alır ve kaynağı doğrudan sorgular.Başlarsanpsql with the parameter -E, ters eğik çizgi komutları arkasındaki SQL gibi\dgörüntülenir.Veya\set ECHO_HIDDEN onpsql komut satırından.Oradan başlayarak sorunuza bir cevap oluşturabilirsiniz.

Bir tablo verildiğinde, bu tablo için sütunların adlarının bir listesine sahip olmak mümkündür.

SELECT attrelid::regclass AS tbl
      , attname      AS col
      , atttypid::regtype AS datatype
       -- more attributes?
FROM  pg_attribute
WHERE attrelid = 'myschema.mytable'::regclass -- table name, optionally schema-qualified
AND  attnum > 0
AND  NOT attisdropped
ORDER BY attnum;

Daha hızlıquerying information_schema.columns.DeneyinEXPLAIN ANALYZEkendin görmek için.Tek seferlik bir arama için hala önemli değil.Ancak, birçok kez tekrarlanan bir sorguda/fonksiyonda kullanıldığında fark yaratabilir.

Ayrıca görünürlükte ince farklılıklar var.Detaylı karşılaştırma:

+1

Gerçekten sana -E'yi gösterip insanlara psql'nin nasıl alınacağını göster. 02 ara. 162016-12-02 20:31:40


52

Diğer cevaplara ek olarak, satır döndürmeyen bir SELECT ifadesi bile sütun adlarını size ve uygulama koduna maruz bırakacaktır.

select *
from table_name
where false;

İzinler, bu yaklaşımların herhangi biriyle devreye girebilir.

  0

çabuk ve kolay.En iyi cevap sadece bir sütun listesi görmem gerekiyorsa. 26 oca. 172017-01-26 18:23:54

  0

Sanırım bu SQL'i psql komutuna geçirmek istemeniz gerekiyor.Çıktıdaki sürprizlerden kaçınmak için bu durumda --no-psqlrc seçeneğini kullanmanızı öneririm. 09 mar. 172017-03-09 19:37:28

  0

En iyi, hızlı ve kolay 04 ara. 172017-12-04 10:31:13

  0

Bu dahi! 01 şub. 182018-02-01 10:07:26