Kuinka luetellaan tietyn taulukon kaikki sarakkeet

Etsin tarkkaa tietoa tietokannasta, josta minulla ei ole tietoa.

Se on kolmannen osapuolen tuote, he vastaavat hitaasti joihinkin kysymyksiin, ja tiedän, että tiedot ovat kyseisen db sisällä, joten haluan tehdä vähän retro-tekniikkaa.

Annettu yksi taulukko, onko mahdollista saada luettelo tämän taulukon sarakkeiden nimistä?

Esimerkiksi SqlServerissä on mahdollista pudottaa taulukko uudelleenkäytettävään CREATE -lausekkeet, joissa luetellaan kaikki sarakkeet, joista taulukko koostuu.

Kommentit

  • Minkälaista käyttöoikeutta sinulla on DB?
  • @dezso, se on erillisellä koneella, mutta voin kirjautua siihen ja käynnistää psql-komentorivin järjestelmänvalvojan oikeuksilla
  • Jos ymmärrän sinut oikein, sinä ovat \dt[+] table_name jälkeen psql.
  • nopeus. \ dt + ei ei näytä näyttävän selkeästi sarakkeiden nimeä. se lisää vain " Description " -kentän.
  • mutta \ d + taulukon nimi toimii!

vastaus

Jo löytämiesi komentorivien \d+ <table_name> lisäksi voit käytä myös tietomallia etsiäksesi saraketiedot käyttämällä information_schema.columns :

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

Huomaa: Varmista yllä olevan esimerkin mukaisesti, että arvot ovat lainausmerkeissä.

Kommentit

  • Tee psql: ssä kysely \x on tai \pset expanded on. tulokset ovat lineaarisia (taulukkojen sijaan) ja siten helpommin luettavia stackoverflow.com/a/9605093/513397
  • Nykyisissä versioissa (kokeillut sitä) kohdassa 9.6) voit tehdä psql: ssä \d+ public.* saadaksesi kaikkien taulukoiden ja näkymien kuvauksen (kaava + indekit / fkeys / laukaisimet) public -malli. Käytämme sitä ennen sitoutumista koukkukomentosarjassa seurataksemme jokaisen sitoutuneen DB: n muutoksia.
  • SELECT column_name saadaksesi vain sarakkeen nimen

Vastaus

Muiden vastausten täydennyksenä jopa SELECT-käsky, joka ei palauta rivejä, paljastaa sarakkeiden nimet sinulle ja sovelluskoodille.

select * from table_name where false; 

Luvat saattavat tulla peliin kaikilla näistä lähestymistavoista.

Kommentit

    i Oletan, että tarkoitat tämän SQL: n välittämistä psql-komennolle. Ehdotan tällöin –no-psqlrc -vaihtoehtoa, jotta vältetään yllätykset tuotoksessa.
  • Paitsi piilotetut sarakkeet, jotka oli määritettävä valittaviksi (kuten pg_class.oid)

Vastaa

tietomalli on hidas ja varma tapa: se on standardoitu ja suurelta osin siirrettävissä muihin sitä tukeviin tietokantoihin. Ja se toimii edelleen tärkeimmissä versioissa.

Tietomallin näkymät kuitenkin liittyvät usein monet -järjestelmän luetteloiden taulukot täyttävät tiukasti standardoitu muoto – joista monet ovat vain kuolleita rahteja suurimman osan ajasta. Tämä tekee heistä hitaasti .
Postgres-kehittäjät eivät anna lupauksia, mutta perustiedot (kuten mitä täällä tarvitaan) ei tule muuttumaan pääversioiden välillä.

psql (natiivi komentoriviliittymä) vie tietysti pikakaistan ja kyselee lähdettä suoraan . Jos aloitat psql parametrilla -E , takana oleva SQL Backslash-komennot, kuten \d, näytetään. Tai \set ECHO_HIDDEN on psql-komentoriviltä. Sieltä alkaen voit rakentaa vastauksen kysymykseesi.

Voiko yhdellä taulukolla olla luettelo sarakkeiden nimistä tätä varten taulukko.

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; 

Nopeampi kuin kysely information_schema.columns . Kokeile EXPLAIN ANALYZE nähdäksesi sen itse. Silti tuskin on merkitystä kertaluonteiselle etsinnälle. Mutta saattaa olla merkitystä, jos sitä käytetään kyselyssä / toiminnossa, joka toistuu useita kertoja.

Näkyvyydessä on myös hienovaraisia eroja. Yksityiskohtainen vertailu:

Kommentit

  • Oikeasti näytät sinulle -E ja näytät ihmisille, kuinka saada psl: n sql.
  • Olen samaa mieltä.Suoritin joitain nopeustestit ja pg_catalog toimii yli kaksi kertaa niin nopeasti

vastaus

psql PostgreSQL 11+ -käyttöjärjestelmässä

Jos etsit saraketyyppejä kyselystä, voit käyttää psql ”s \gdesc

SELECT NULL AS zero, 1 AS one, 2.0 AS two, "three" AS three, $1 AS four, sin($2) as five, "foo"::varchar(4) as six, CURRENT_DATE AS now \gdesc Column | Type --------+---------------------- zero | text one | integer two | numeric three | text four | text five | double precision six | character varying(4) now | date (8 rows) 

vastaus

vain PostgreSQL

Tämä on hieman hokey, mutta voi olla haastaja, jos etsit mahdollisimman lyhyttä SQL: ää:

SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, "{}"::JSON))) 

tai jopa lyhyempi (olettaen, että taulukossa on vähintään yksi rivi)

SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1))) 

Tiedot säilyttävät järjestyksen. Jos et välitä tilauksesta ja sinulla on hstore -laajennus asennettuna, voit tehdä siitä vieläkin lyhyemmän

SELECT skeys(hstore(NULL::schema_name.table_name)) 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *