Există în Postgres un echivalent al funcției SHOW CREATE TABLE din MySQL? (Administrarea sistemului, Mysql, Postgresql, Sql)

vlebar a intrebat.

Există un echivalent al lui MySQL SHOW CREATE TABLE în Postgres? Este posibil acest lucru? Dacă nu, care este cea mai bună soluție următoare?

Am nevoie de declarație pentru că o folosesc pentru a crea tabelul pe un server la distanță (prin WCF).

8 răspunsuri
RJS

Puteți încerca să urmăriți în fișierul jurnal PostgreSQL ce face cu adevărat „pg_dump -t table -s”. apoi puteți folosi aceeași metodă pentru a scrie propria funcție sql.

Comentarii

  • ok, am urmărit pg_dump. Dar nu a fost la fel de ușor, pentru că a trebuit să-mi scriu propria funcție în C# pentru a scrie instrucțiunea create table. Dar a fost de mare ajutor, așa că vă mulțumesc veeeeerrrryyyy mult 😀 -.  > Por vlebar.
  • Nu este nevoie să vă deranjați atât de mult – conform aici puteți folosi funcția -E pentru a urmări ce se întâmplă în fundal atunci când executați o aplicație psql comandă – -E: will describe the underlaying queries of the commands (cool for learning!) – HTH! –  > Por Vérace.
alvosu

pg_dump:

pg_dump -st tablename dbname

sau folosiți instrumentele GUI PostgreSQL (pgAdmin,phpPgAdmin,etc.)

Comentarii

  • o să încerc să explic problema mai în detaliu. Am nevoie de declarația sql (select sau stored procedure) pentru că execut comanda sql în C# (NpgsqlCommand). Deci cred că pg_dump nu este soluția în acest caz 🙁 -.  > Por vlebar.
  • De ce nu? --schema-only are exact acest scop: Arată instrucțiunile SQL pentru a crea schema/tabla. Puteți apoi să introduceți cumva această ieșire în programul C#. –  > Por Sven.
  • uitați-vă la vizualizările information_schema: postgresql.org/docs/9.0/interactive/information-schema.html –  > Por alvosu.
  • @SvenW: Aș face asta dacă aș avea un set cunoscut de tabele. Problema este că utilizatorul poate, dacă dorește, să sincronizeze orice tabel din baza de date selectată și apoi să creeze tabelul selectat pe un server la distanță în spatele unui serviciu wcf. Pot face asta cu mssql și acum vreau să extind programul client la alte servere sql (mysql, oracle, postgresql, …) OK, pot face pg_dump pentru o tabelă pe care utilizatorul vrea să o sincronizeze, dar dacă este posibil să fac asta doar în plsql, vreau să o fac în plsql –  > Por vlebar.
  • În cazul în care se face dumping în .tar, luați restore.sql fișier din arhivă. Are toate declarațiile de creare. –  > Por Joseph Lust.
Lukasz Czerwinski

În linia de comandă (psql) puteți rula: d <table name> pentru a lista toate coloanele, tipurile și indicii acestora.

Comentarii

    16

  • Acest lucru este util, dar nu răspunde la întrebare. –  > Por ryantuck.
  • Întrebarea este diferită. –  > Por Ivailo Bardarov.
  • Nu răspunde la întrebare și nu pot să înțeleg de ce atât de mulți oameni au votat asta – -.  > Por Farley.
EoghanM

Pornind de la prima parte a răspunsului lui @CubicalSoft, puteți introduce următoarea funcție care ar trebui să funcționeze pentru tabele simple (presupune schema implicită „public” și omite constrângerile, indicii și tipurile de date definite de utilizator etc. etc.). Răspunsul lui @RJS este singura modalitate de a face acest lucru în mod corespunzător în acest moment; acesta este un lucru care ar trebui să fie integrat în psql!

CREATE OR REPLACE FUNCTION show_create_table(table_name text, join_char text = E'
' ) 
  RETURNS text AS 
$BODY$
SELECT 'CREATE TABLE ' || $1 || ' (' || $2 || '' || 
    string_agg(column_list.column_expr, ', ' || $2 || '') || 
    '' || $2 || ');'
FROM (
  SELECT '    ' || column_name || ' ' || data_type || 
       coalesce('(' || character_maximum_length || ')', '') || 
       case when is_nullable = 'YES' then '' else ' NOT NULL' end as column_expr
  FROM information_schema.columns
  WHERE table_schema = 'public' AND table_name = $1
  ORDER BY ordinal_position) column_list;
$BODY$
  LANGUAGE SQL STABLE;

Comentarii

  • Acesta ar trebui să fie răspunsul acceptat –  > Por exebook.
  • Vă mulțumim pentru acest lucru! –  > Por frank.
  • EoghanM, este excelent. Mulțumesc! –  > Por Eric M.
CubicleSoft

Îmi dau seama că am întârziat puțin la această petrecere, dar acesta a fost primul rezultat la căutarea mea pe Google, așa că m-am gândit să răspund cu ceea ce am găsit.

Puteți ajunge destul de departe spre o soluție cu această interogare pentru a obține coloanele:

SELECT *
FROM information_schema.columns
WHERE table_schema = 'YOURSCHEMA' AND table_name = 'YOURTABLE'
ORDER BY ordinal_position;

Și apoi această interogare pentru cei mai comuni indici:

SELECT c.oid, c.relname, a.attname, a.attnum, i.indisprimary, i.indisunique
FROM pg_index AS i, pg_class AS c, pg_attribute AS a
WHERE i.indexrelid = c.oid AND i.indexrelid = a.attrelid AND i.indrelid = 'YOURSCHEMA.YOURTABLE'::regclass
ORDER BY" => "c.oid, a.attnum

Apoi, este vorba de a construi șirul (șirurile) de interogare în formatul potrivit.

Žiga

Extensia Postgres ddlx (https://github.com/lacanoid/pgddl) face exact acest lucru și chiar mai mult.

Enrico Bianchi

Așa cum s-a răspuns în https://serverfault.com/a/875414/333439, cu extensia d <table> meta-comandă din psql este posibilă afișarea structurii tabelelor din baza de date. Dacă doriți să vizualizați interogarea utilizată în meta-comandă, puteți utiliza comanda psql -E. Așa cum este descris în pagina de manual, comanda -E switch-ul transmite ecoul comenzii d interogările meta-comandelor. Astfel, puteți lansa psql -E, puteți vizualiza structura tabelelor cu d <table> meta-comandă, și, în funcție de -E switch, puteți vizualiza interogarea generată pentru a descrie structura tabelului

Comentarii

  • Pot vedea comenzile SQL utilizate pentru a afișa rezultatul „d table”, dar nu pot vedea instrucțiunea SQL utilizată pentru a crea tabelul. –  > Por Ivailo Bardarov.
Christopher K.

În pgAdmin 4, trebuie doar să găsiți tabelul în arborele din stânga, de ex:

Servers
+ PostgreSQL 11
  + Databases
    + MYDATABASENAME
      + Schemas
        + public
          + Tables
            + MYTABLENAME  <-- click this tree element

Când tabelul este selectat, deschideți fereastra fila SQL din dreapta. Aceasta afișează CREATE TABLE pentru tabelul selectat.